Как вы сравниваете хэши на равенство, которые содержат разные ключевые форматы (некоторые строки, некоторые символы) в Ruby? - PullRequest
3 голосов
/ 19 марта 2012

Я использую ruby ​​1.9.3, и мне нужно сравнить два хэша, которые имеют разные форматы ключей.Например, я хочу, чтобы равенство следующих двух хешей было истинным:

hash_1 = {:date => 2011-11-01, :value => 12}
hash_2 = {"date" => 2011-11-01, "value" => 12}

Любые идеи о том, как эти два хэша можно сравнить в одной строке кода?

1 Ответ

3 голосов
/ 19 марта 2012

Stringify ключи на хеш, который имеет символы:

 > hash_1.stringify_keys
=> {"date"=>"2011-11-01", "value"=>12} 

Затем сравните.Итак, ваш ответ в одной строке:

 > hash_1.stringify_keys == hash_2    
=> true

Вы могли бы сделать это и наоборот, символизируя строковые ключи в hash_2 вместо их строкового преобразования в hash_1:

 > hash_1 == hash_2.symbolize_keys
=> true

Если вы хотите, чтобы строка / символизация была постоянным изменением, используйте версию с ударом !: stringify_keys! или symbolize_keys! соответственно

 > hash_1.stringify_keys!                # <- Permanently changes the keys in hash_1 into Strings
=> {"date"=>"2011-11-01", "value"=>12}   #    as opposed to temporarily changing them for comparison

Ref: http://as.rubyonrails.org/classes/HashWithIndifferentAccess.html

Кроме того, я предполагаю, что вы хотели поставить цитаты вокруг дат ...

:date => "2011-11-01"

... или,явно создавать их как объекты Date?

:date => Date.new("2011-11-01")

То, как вы пишете дату, теперь устанавливает :date в 2011-11-01 В настоящее время они интерпретируются как серии целых чисел с вычитанием вмежду ними.

То есть:

 > date = 2011-11-01
=> 1999                # <- integer value of 2011, minus 11, minus 1
...