使用嵌套哈希和哈希作为默认值并不按预期工作

时间:2015-10-08 01:20:45

标签: ruby hash

我想理解为什么a在调用a[:a]之后是一个空哈希,这不是空的:

a = Hash.new({a:1}) # => {}
a[:a][:a] += 1      # => 2
a                   # => {}
a[:a]               # => {:a=>2}

我知道{a: 1}在每个不存在的密钥(a[:something_inexistent])之间共享。但为什么它不显示为a的关键字?如果可能的话,使用Ruby的内部将非常感激。

1 个答案:

答案 0 :(得分:5)

这是因为永远不会分配a[:a]。执行a[:a]时,它不会返回存储的值,而是返回默认值。

与此不同的是,当你改为:

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

然后,每当调用一个丢失的键时,就会执行该块,该值将该值赋给该键,a将不再是空哈希。