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

Nin*_*inx 27 ruby

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

所以,我编码

x = Hash.new([])
Run Code Online (Sandbox Code Playgroud)

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

x[0].push(99)
Run Code Online (Sandbox Code Playgroud)

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

Mys*_*yst 48

拉克希米是对的.使用Hash创建时Hash.new([]),您创建了一个数组对象.

因此,为Hash中的每个缺失键返回相同的数组.

这就是为什么,如果编辑共享阵列,则更改将反映在所有缺失的键上.

使用:

Hash.new { |h, k| h[k] = [] }
Run Code Online (Sandbox Code Playgroud)

为哈希中的每个缺失键创建并分配一个数组,以便它是一个唯一的对象.

  • @vildhjarta `Hash.new(Array.new)` 在将新数组传递给 Hash 构造函数之前仅创建数组一次,因此所有丢失的对象共享同一个数组。每次调用该块时,“Hash.new {Array.new}”都会创建一个新数组(“{Array.new}”),这会为每个丢失的对象生成一个新数组。 (2认同)

Lak*_*hmi 25

h = Hash.new{|h,k| h[k] = [] }

h[0].push(99)
Run Code Online (Sandbox Code Playgroud)

这将导致 {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)h[0] = []值分配并推送到这个新数组中.