具有默认值的嵌套分配的奇怪的哈希行为

乔什·迪尔(Josh Diehl)

控制台输出:

2.1.3 :011 > b = Hash.new( Hash.new([]) )
 => {}
2.1.3 :012 > b[:a][:b] << 'hello'
 => ["hello"]
2.1.3 :013 > b
 => {}
2.1.3 :014 > b.size
 => 0
2.1.3 :015 > b.keys
 => []
2.1.3 :016 > b[:a][:b]
 => ["hello"]

为什么我可以访问存储在b[:a][:b]b大小为0并且没有键的值?

奥雅纳·拉希特(Arup Rakshit)

new(obj) → new_hash

如果obj指定,则此单个对象将用于所有默认值。

现在Hash.new([])正在保存默认Array对象。现在,b[:a][:b] << 'hello'您输入的"hello"是默认值Array中不存在时,将返回默认Hash

不要以为您将密钥添加到哈希对象 b[:a][:b] << 'hello' line.

b[:a]提供默认Hash对象Hash.new([])现在,Hash您可以Hash#[]使用key调用对象:b,但是:b与不存在的键一样,它也提供了默认Array对象。

这就是为什么bb.sizeb.keys所有被证明Hash是空的。

最后。

为什么我可以访问存储在b [:a] [:b]中的值,但是b的大小为0并且没有键?

因为,如上所述,您将值添加"Hello"到default Array当您使用线路时,该值即将到来b[:a][:b]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章