我想在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)
为哈希中的每个缺失键创建并分配一个新数组,以便它是一个唯一的对象.
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] = []值分配并推送到这个新数组中.
| 归档时间: |
|
| 查看次数: |
11827 次 |
| 最近记录: |