我正在使用 ruby 1.9.3,我需要比较两个具有不同密钥格式的哈希。例如,我希望以下两个哈希值相等:
hash_1 = {:date => 2011-11-01, :value => 12}
hash_2 = {"date" => 2011-11-01, "value" => 12}
关于如何在一行代码中比较这两个哈希的任何想法?
我正在使用 ruby 1.9.3,我需要比较两个具有不同密钥格式的哈希。例如,我希望以下两个哈希值相等:
hash_1 = {:date => 2011-11-01, :value => 12}
hash_2 = {"date" => 2011-11-01, "value" => 12}
关于如何在一行代码中比较这两个哈希的任何想法?
将具有符号的散列上的键字符串化:
> 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
如果您希望字符串化/符号化成为永久更改,请使用带有 bang 的版本!
: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
参考: 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