创建一个值为数组的哈希值和默认值为空数组
我想在Ruby中创建一个Hash,默认值为空数组
所以,我编码
x = Hash.new([])
但是,当我尝试将值推入其中时
x[0].push(99)
所有键都被99
推入该arrays。 我该如何解决这个问题?
拉克希米是对的。 使用Hash.new([])
创建Hash时,您创建了一个数组对象。
因此,为Hash中的每个缺失键返回相同的数组。
这就是为什么,如果编辑共享arrays,则更改将反映在所有缺失的键上。
使用:
Hash.new { |h, k| h[k] = [] }
为Hash中的每个缺失键创建并分配一个新数组,以便它是一个唯一的对象。
h = Hash.new{|h,k| h[k] = [] } h[0].push(99)
这将导致{0=>[99]}
当使用Hash.new([])
,单个对象用作默认值(即当散列键h[0]
不返回任何内容时要返回的值),在本例中为一个数组。
所以当我们说h[0].push(99)
,它会将99
推入该数组,但不会分配h[0]
任何东西。 因此,如果输出h
您仍会看到空哈希{}
,而默认对象将是[99]
。
然而,当提供块时,即Hash.new{|h,k| h[k] = [] }
Hash.new{|h,k| h[k] = [] }
创建一个新对象,并在每次需要默认值时分配给h[k]
。
h[0].push(99)
将分配h[0] = []
并将值推入此新数组。