使用值作为数组创建哈希,将默认值创建为空数组

时间:2015-05-21 07:41:25

标签: ruby

我想在Ruby中创建一个Hash,默认值为空数组

所以,我编码了

x = Hash.new([])

但是,当我尝试将值推入其中时

x[0].push(99)

所有键都被99推入该数组。我该如何解决这个问题?

2 个答案:

答案 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)并将值推送到此新数组中。