哈希#compare_by_identity与字符串文字

时间:2015-10-18 01:50:19

标签: ruby string hash string-comparison

我正在运行Ruby 2.2.1。 以下代码按预期运行,因为字符串哈希键被欺骗和冻结:

f = 'foo'              
h = {f => 'bar'}       
h.compare_by_identity  
h[f]                  # => nil 
h['foo']              # => nil 
h[h.keys.first]       # => "bar"

但我不能为我的生活弄清楚这里发生了什么:

h = {'foo' => 'bar'}   
h.compare_by_identity  
h.keys.first.frozen?   # => true 
'foo'.frozen?          # => false 
h.keys.first.object_id # => 20421220 
'foo'.object_id        # => 20067280 
h['foo']               # => "bar" 
h['foo'.dup]           # => nil 

值得注意的是#compare_by_identity的文档在2.2.0开始使用#dup。所以看来这种行为改变是已知的。

2.1.7:

h1["a"]        #=> nil  # different objects.

2.2.0:

h1["a".dup]    #=> nil  # different objects.

但是,来源是一样的。

其他文字如数组也不会发生同样的情况。关于为什么这种行为改变了字符串文字的任何想法?文档没有提供关于原因的提示。

0 个答案:

没有答案