我正在进行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"

10-07 17:49