Порядок элементов в хэше не гарантируется. Вам придется отсортировать ключи, если вы хотите гарантированный заказ.
Якобы это исправлено в 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?
и вот мой результат:
## @search_results
[{:url=>"http://lifehacker.com"},
{:url=>"http://stackoverflow.com"},
{:url=>"http://43folders.com"},
{:url=>"http://lolindrath.com"}]
Теперь , что было тем, что я ожидал: это то, что вы подразумеваете под "искаженным"?
Редактировать 2: После дальнейших исследований, я думаю, это из-за очень строгих правил Руби при преобразовании небулевых данных в логические (см. Ruby Gotchas в Википедии и Переполнение стека, конечно ), так что все, что только ложно, действительно ложно, а все остальное верно. поэтому .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