考虑以下代码:h = Hash.new(0) # 新的哈希对默认将具有 0 作为值h[1] += 1 #=> {1=>1}h[2] += 2 #=> {2=>2} 这些都很好,但是:h = Hash.new([]) # 空数组...
考虑以下代码:
h = Hash.new(0) # New hash pairs will by default have 0 as values
h[1] += 1 #=> {1=>1}
h[2] += 2 #=> {2=>2}
这一切都很好,但是:
h = Hash.new([]) # Empty array as default value
h[1] <<= 1 #=> {1=>[1]} ← Ok
h[2] <<= 2 #=> {1=>[1,2], 2=>[1,2]} ← Why did `1` change?
h[3] << 3 #=> {1=>[1,2,3], 2=>[1,2,3]} ← Where is `3`?
此时我期望哈希值为:
{1=>[1], 2=>[2], 3=>[3]}
但事实并非如此。发生了什么事?我怎样才能获得我期望的行为?
当你写作时,
h = Hash.new([])
您将数组的默认引用传递给哈希中的所有元素。因为哈希中的所有元素都引用同一个数组。
如果你希望哈希中的每个元素引用单独的数组,你应该使用
h = Hash.new{[]}
有关它在 ruby 中的工作原理的更多详细信息,请参阅: http://ruby-doc.org/core-2.2.0/Array.html#method-c-new