散列中元素的顺序不能保证。如果您需要保证订单,则必须对密钥进行排序。
我认为这应该在Ruby 1.9中修复。
编辑:我假设数组中的搜索结果,如果一个Hash然后顺序不能保证,你将不得不键排序,这里是我的测试是什么样子:
#!/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?
结束,这里是我的结果:
## @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?
显式转换为true/false。
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
变量“结果”来自哪里?它的顺序可能是不确定的(例如,如果它是哈希或集合)。 – Chuck 2009-02-05 23:48:12
请定义'乱码':你期望它们在什么顺序?订单如何变化? – Lolindrath 2009-02-06 12:56:05
@chuck - 结果是一个数组。 @Lolindrath - 我期望的顺序与它插入的顺序相同。相反,它给出了一个随机顺序。 – Sanjay 2009-02-06 13:13:14