diff红宝石字符串或者数组
如何在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
,并专注于方便性和提供漂亮的输出选项。