我想在Ruby中创建一个Hash,默认值为空数组
所以,我编码了
x = Hash.new([])
但是,当我尝试将值推入其中时
x[0].push(99)
所有键都被99
推入该数组。我该如何解决这个问题?
答案 0 :(得分:41)
Hash.new([])
创建哈希时,您创建了一个数组对象。
因此,Hash中每个缺少键都会返回相同的数组。
这就是为什么,如果编辑共享数组,更改将反映在所有缺失的键上。
使用:
Hash.new { |h, k| h[k] = [] }
为哈希中的每个缺失键创建并指定一个 new 数组,以便它是一个唯一的对象。
答案 1 :(得分:21)
https://github.com/scripting/noderunner
这将导致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] = [] }
。
h[k]
将分配h[0].push(99)
并将值推送到此新数组中。