考虑以下代码:
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)
但它远非如此.发生了什么,我怎样才能得到我期望的行为?
灵感来自我如何用数组编组哈希?我想知道Array#<<在以下代码中无法正常工作的原因是什么:
h = Hash.new{Array.new}
#=> {}
h[0]
#=> []
h[0] << 'a'
#=> ["a"]
h[0]
#=> [] # why?!
h[0] += ['a']
#=> ["a"]
h[0]
#=> ["a"] # as expected
Run Code Online (Sandbox Code Playgroud)
它是否与<<在就地更改数组的事实有关,同时Array#+创建了一个新实例?
好的,所以我想创建一个散列,其中有一个空散列作为默认值.我知道,有点奇怪,但是我想我觉得它可能有用.
所以这就是我做的:
>> a = Hash.new({})
=> {}
>> a[:a][:b] = 5
=> 5
>> a
=> {}
>> a[:a]
=> {:b=>5}
>> a.keys
=> []
>> a.size
=> 0
>> a[:a].size
=> 1
Run Code Online (Sandbox Code Playgroud)
换句话说,当我检查哈希时,我没有看到哈希成员,但我可以通过它的密钥访问它.
这是预期的行为吗?这里发生了什么?
顺便说一下,这是Ruby 1.9.1,还没有尝试过早期版本.
编辑:简化示例,因为它不必是散列哈希哈希...