我正在运行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.
但是,来源是一样的。
其他文字如数组也不会发生同样的情况。关于为什么这种行为改变了字符串文字的任何想法?文档没有提供关于原因的提示。