0
@search_results = Array.new
duplicates = Set.new
results.each { |result|    @search_results.push(result) unless duplicates.add?(result[:url]) }

这段代码混淆了数组@search_results 中元素的顺序。为什么在集合和数组中插入相同的元素会改变数组的插入顺序?似乎元素引用存在一些问题。有人可以解释吗?

编辑1:我正在使用一个数组。很抱歉之前的错字。我通过代码进行了双重检查,它也使用了 Array(无论如何都没有 Hash 的推送方法)

4

2 回答 2

2

不保证 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"}]

我发现这很奇怪,所以为了确定,我.nil?在末尾加上了一个 add .add?,这是我的结果:

## @search_results
[{:url=>"http://lifehacker.com"},
 {:url=>"http://stackoverflow.com"},
 {:url=>"http://43folders.com"},
 {:url=>"http://lolindrath.com"}]

现在就是我所期待的:这就是你所说的“乱码”吗?

编辑 2:经过进一步调查,我认为这是因为 Ruby 在将非布尔数据转换为布尔值时有非常严格的规则(当然,请参阅Wikipedia 上的 Ruby GotchasStack Overflow),因此基本上任何只有假的东西都是真的假的,一切否则是真的。因此.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
于 2009-02-05T17:41:03.883 回答
0

乱码怎么办?是什么样的对象results?如果results是 aSet或 a Hash,那么您不能保证任何两个遍历 ofresults的顺序相同。

另外,你可以做

@search_results = results.uniq

ifresults是一个Array获得所有独特结果的方法。

------------------------------------------------------------- Array#uniq
     array.uniq   -> an_array
------------------------------------------------------------------------
     Returns a new array by removing duplicate values in self.

        a = [ "a", "a", "b", "b", "c" ]
        a.uniq   #=> ["a", "b", "c"]
于 2009-02-05T19:22:11.727 回答