可能重复:
Ruby 方法 Array#<< 未更新哈希中的数组
使用 Hash.new([]) 时奇怪的 ruby 行为
我一直在做很棒的Koans,随着我的发展,我没有发现任何大问题,但我偶然发现了这一点,并且无法理解它:
def test_default_value_is_the_same_object
hash = Hash.new([])
hash[:one] << "uno"
hash[:two] << "dos"
assert_equal ["uno", "dos"], hash[:one] # But I only put "uno" for this key!
assert_equal ["uno", "dos"], hash[:two] # But I only put "dos" for this key!
assert_equal ["uno", "dos"], hash[:three] # I didn't shove anything for :three!
assert_equal true, hash[:one].object_id == hash[:two].object_id
end
所有测试都通过了(我只是查看了帮助我猜测要编写正确断言的错误)。
最后一个断言,好的,它们都没有初始化,因此它们的值必须具有相同的对象 ID,因为它们都采用默认值。
我不明白为什么默认值被改变了,我什至不完全确定发生了什么。
我在 IRB 中进行了尝试,认为可能对 Hash/Array 进行了一些篡改让我发疯,但我得到了相同的结果。
我最初以为hash[:one] << "uno"
会暗示hash
成为{ one: ["uno] }
,但它仍然存在{ }
。
虽然我猜<<
只是调用push
,并且只有在您使用=
标志时才会添加新键
请告诉我我错过了什么。
编辑:我正在使用 Ruby 1.9.3