创建一个值为数组的哈希值和默认值为空数组

我想在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] = []并将值推入此新数组。