我想初始化一个Hash
与一个空的Array
对于每个新键,将某个值推送到该数组。
这是我尝试做的:
a = Hash.new([])
# => {}
a[1] << "asd"
# => ["asd"]
a
# => {}
预期输出为a
was {1 => ["asd"]}
但那并没有发生。我在这里缺少什么?
红宝石版本:
ruby 2.0.0p598 (2014-11-13 revision 48408) [x86_64-linux]
Just do
a = Hash.new { |h, k| h[k] = [] }
a[1] << "asd"
a # => {1=>["asd"]}
阅读以下几行Hash::new文档。它确实解释了为什么你没有得到想要的结果。
新(obj)→ new_hash
如果指定了 obj,则该单个对象将用于所有默认值。
新的{|哈希值,密钥|块 } → new_hash
如果指定了一个块,它将使用哈希对象和键来调用,并且应该返回默认值。如果需要,块有责任将值存储在哈希中。
您可以手动测试:
a = Hash.new([])
a[1].object_id # => 2160424560
a[2].object_id # => 2160424560
现在有了上面的风格Hash
对象创建时,您可以看到对对象的每次访问未知密钥,返回相同的default目的。现在换个方式,我的意思是挡路 :
b = Hash.new { |h, k| [] }
b[2].object_id # => 2168989980
b[1].object_id # => 2168933180
所以,随着block形式,每未知密钥访问,返回一个新的Array
object.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)