Hash 中元素的顺序无法保证。如果您想要保证顺序,则必须对键进行排序。
我相信这应该在 Ruby 1.9 中得到修复。
编辑:我假设你的结果是一个数组,如果它是一个哈希,那么顺序就不能保证,你必须对键进行排序,这是我的测试的样子:
#!/usr/bin/ruby -W
require 'pp'
require 'set'
results = Array.new
results << {:url => 'http://lifehacker.com'}
results << {:url => 'http://stackoverflow.com'}
results << {:url => 'http://43folders.com'}
results << {:url => 'http://lolindrath.com'}
results << {:url => 'http://stackoverflow.com'}
results << {:url => 'http://lifehacker.com'}
@search_results = Array.new
duplicates = Set.new
results.each { |result| @search_results.push(result) unless duplicates.add?(result[:url])}
puts "## @search_results"
pp @search_results
如果我运行它,结果如下:
## @search_results
[{:url=>"http://stackoverflow.com"}, {:url=>"http://lifehacker.com"}]
我发现这很奇怪,所以为了确定,我在.add? 末尾添加了一个.nil?,这是我的结果:
## @search_results
[{:url=>"http://lifehacker.com"},
{:url=>"http://stackoverflow.com"},
{:url=>"http://43folders.com"},
{:url=>"http://lolindrath.com"}]
现在那是我所期待的:这就是你所说的“乱码”吗?
编辑 2: 经过进一步调查,我认为这是因为 Ruby 在将非布尔数据转换为布尔值时有非常严格的规则(参见 Ruby Gotchas on Wikipedia 和 Stack Overflow, of course),因此基本上任何只有假是真的假,其他一切都是真的。所以.nil? 将其显式转换为真/假。
irb(main):007:0> puts "zero is true" if 0
zero is true
=> nil
irb(main):008:0> puts "zero is false" unless 0
=> nil