使用+ =更新使用默认proc的哈希时的奇怪行为

时间:2016-05-04 22:26:26

标签: ruby hash

为什么是这个哈希:

test_hash = Hash.new{|hash, key|
              Hash.new{|second_level_hash, second_level_key| 0 }
            }

未通过以下操作更新?

test_hash[1][1] += 1
test_hash[1][1] # => 0

2 个答案:

答案 0 :(得分:4)

你实际上并没有将值分配给哈希,你只是返回一个哈希值和一个独立的0值。这些被修改,然后扔掉。

通过执行作业来解决此问题:

test_hash = Hash.new { |h,k|
  h[k] = Hash.new(0)
}

您可以告诉某些内容出错,因为在访问test_hash[1][1]后,调用test_hash.inspect它仍然是空的。

答案 1 :(得分:2)

tadman的答案是(中途)正确,但可能有点误导。

您正在为嵌入式哈希值分配值,但不会将嵌入式哈希分配给主哈希。每次在主哈希中调用密钥时,都会创建一个新的嵌入式哈希。为嵌入式哈希值分配值后,已成为{1 => 1}的嵌入式哈希未分配给主哈希,并被丢弃。