diff红宝石字符串或者数组

时间:2020-03-05 18:57:57  来源:igfitidea点击:

如何在Ruby中比较两个字符串或者数组?

解决方案

回答

diff.rb是我们想要的,可以通过Internet存档在http://users.cybercity.dk/~dsl8950/ruby/diff.html上找到:

http://web.archive.org/web/20140421214841/http://users.cybercity.dk:80/~dsl8950/ruby/diff.html

回答

对于数组,请使用减号运算符。例如:

>> foo = [1, 2, 3]
=> [1, 2, 3]
>> goo = [2, 3, 4]
=> [2, 3, 4]
>> foo - goo
=> [1]

在这里,最后一行从foo中删除了同样也是goo的所有内容,只保留了元素1. 数组,使用减号运算符,然后将结果转换回。

回答

对于字符串,我将首先尝试下面@ sam-saffron提到的Ruby Gem。安装起来更容易:
http://github.com/pvande/differ/tree/master

gem install differ

irb
require 'differ'

one = "one two three"
two = "one two 3"

Differ.format = :color
puts Differ.diff_by_word(one, two).to_s

Differ.format = :html
puts Differ.diff_by_word(one, two).to_s

回答

还有diff-lcs可以作为gem获得。自2004年以来未进行过更新,但我们一直在使用它而没有任何问题。

编辑:2011年发布了一个新版本。看起来它正在积极开发中。

http://rubygems.org/gems/diff-lcs

回答

@ da01上面提到的HTMLDiff对我有用。

script/plugin install git://github.com/myobie/htmldiff.git

# bottom of environment.rb
require 'htmldiff'

# in model
class Page < ActiveRecord::Base
  extend HTMLDiff
end

# in view
<h1>Revisions for <%= @page.name %></h1>
<ul>
<% @page.revisions.each do |revision| %>
  <li>
    <b>Revised <%= distance_of_time_in_words_to_now revision.created_at %> ago</b><BR>
      <%= Page.diff(
        revision.changes['description'][0],
        revision.changes['description'][1]
      ) %>
      <BR><BR>
  </li>
<% end %>

# in style.css
ins.diffmod, ins.diffins { background: #d4fdd5; text-decoration: none; }
del.diffmod, del.diffdel { color: #ff9999; }

看起来还不错顺便说一下,我将其与acts_as_audited插件一起使用了。

回答

我刚刚找到了一个看起来非常灵活的新项目:

http://github.com/pvande/differ/tree/master

尝试一下,将尝试发布某种报告。

回答

我也有同样的疑问,我发现的解决方案不是100%的红宝石,但对我来说是最好的。
diff.rb的问题在于它没有漂亮的格式化程序,无法以人性化的方式显示差异。因此,我将OS中的diff与以下代码结合使用:

def diff str1, str2
   system "diff #{file_for str1} #{file_for str2}"
 end

 private
 def file_for text
   exp = Tempfile.new("bk", "/tmp").open
   exp.write(text)
   exp.close
   exp.path
 end

回答

我对在ruby中缺少一个好的库感到沮丧,所以我写了http://github.com/samg/diffy。它在幕后使用diff,并专注于方便性和提供漂亮的输出选项。