为什么Ruby Koans练习的about_hashes.rb中的test_default_value_is_the_same_object具有数组的答案?

Pen*_*nny 5 ruby arrays hash key key-value

我正在进行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
Run Code Online (Sandbox Code Playgroud)

我不确定为什么无论键是什么,值总是"uno"和"dos"?我以为当键是one,返回的值应该是"uno"; 当key为"two"时,返回的值应为"dos".为什么不管键是什么,值总是一个数组?

谢谢,我期待着你的回答!

Ama*_*dan 15

hash = Hash.new([])
Run Code Online (Sandbox Code Playgroud)

将实例化一个新数组[](让我们称之为Harvey),然后使用Harvey作为默认值进行哈希.

hash[:one]
Run Code Online (Sandbox Code Playgroud)

不存在,所以你得到哈维.哈维"uno"加入他,使用Array#<<运营商(相当于harvey.push("one"))

hash[:two]
Run Code Online (Sandbox Code Playgroud)

也不存在,所以你再次得到哈维(谁记得已经包含"uno").他现在也得到了"dos".

hash[:three]
Run Code Online (Sandbox Code Playgroud)

哈维回来了,仍然带着他的"uno""dos".

如果您希望代码的行为与您认为的那样,每个键中的数组不同,则每次需要默认时都需要返回一个新数组,而不是每次都返回Harvey:

hash = Hash.new { |h, k| h[k] = [] }
Run Code Online (Sandbox Code Playgroud)

如果你只想让哈希与数组无关,请忽略哈维,并使用Hash#[]=而不是Array#<<:

hash = Hash.new()

hash[:one] = "uno"
hash[:two] = "dos"
Run Code Online (Sandbox Code Playgroud)