考虑以下代码:
h = Hash.new(0) # New hash pairs will by default have 0 as values
h[1] += 1 #=> {1=>1}
h[2] += 2 #=> {2=>2}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但是:
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`?
Run Code Online (Sandbox Code Playgroud)
在这一点上,我希望哈希是:
{1=>[1], 2=>[2], 3=>[3]}
Run Code Online (Sandbox Code Playgroud)
但它远非如此.发生了什么,我怎样才能得到我期望的行为?
我想Hash用空的初始化a Array和每个新的键将一个值推送到该数组.
这是我试图做的事情:
a = Hash.new([])
# => {}
a[1] << "asd"
# => ["asd"]
a
# => {}
Run Code Online (Sandbox Code Playgroud)
预期的产出a是,{1 => ["asd"]}但没有发生.我在这里错过了什么?
Ruby版本:
ruby 2.0.0p598 (2014-11-13 revision 48408) [x86_64-linux]
Run Code Online (Sandbox Code Playgroud)