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)