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

时间:2014-10-06 19:11:34

标签: ruby hash

控制台输出:

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且没有密钥?

1 个答案:

答案 0 :(得分:0)

new(obj) → new_hash

  

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

现在Hash.new([])持有默认Array 对象。现在b[:a][:b] << 'hello'正在输入,"hello"为默认Array。当没有时,默认值将被返回不存在于Hash

不要认为您使用此b[:a][:b] << 'hello' line.

向Hash对象添加键

b[:a]正在提供默认Hash 对象,即Hash.new([])。现在,在Hash对象上,您使用密钥Hash#[]呼叫:b,但由于:b是不存在的密钥,因此它提供默认值{{1 } 对象。

这就是为什么Arraybb.size都证明b.keys为空。

最后。

  

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

因为,您已将值Hash添加到默认"Hello",如上所述。当您使用第Array行时,该值即将到来。