我正在进行ruby koans练习,但对于test_default_value_is_the_same_object方法练习中的答案为何如此感到有些困惑。下面是代码:
def test_default_value_is_the_same_object
hash = Hash.new([])
hash[:one] << "uno"
hash[:two] << "dos"
assert_equal ["uno", "dos"], hash[:one]
assert_equal ["uno", "dos"], hash[:two]
assert_equal ["uno", "dos"], hash[:three]
end
我不确定为什么无论键是什么,值始终是“uno”和“dos”?我以为当键是
one
时,返回值应该是“uno”;当键为“两个”时,返回值应为“dos”。为什么无论键是什么,值始终是数组?谢谢,我们期待您的答复!
最佳答案
hash = Hash.new([])
将使用
[]
实例化一个新数组(我们称其为Harvey),然后使用Harvey作为默认值进行散列。hash[:one]
不存在,所以您得到了Harvey。 Harvey使用
"uno"
运算符(相当于Array#<<
)将harvey.push("one")
添加到他中hash[:two]
还不存在,因此您又得到了Harvey(记住,他已经包含
"uno"
了)。现在,他还获得了"dos"
。hash[:three]
返回Harvey,仍然带有
"uno"
和"dos"
。如果您希望代码的行为像您想的那样,每个键中都有一个不同的数组,则每次需要默认值时都需要返回一个新数组,而不是每次都返回Harvey:
hash = Hash.new { |h, k| h[k] = [] }
而且,如果您只希望哈希与数组无关,请忽略Harvey,并使用
Hash#[]=
而不是Array#<<
:hash = Hash.new()
hash[:one] = "uno"
hash[:two] = "dos"