哈希值与`<<`运算符之间的交互

gor*_*orn 2 ruby hash

我期望:

h = Hash.new([])
h['a'] << 'b'
h['a'] << 'c'
h # => {}
Run Code Online (Sandbox Code Playgroud)

{'a' => ['b','c']}.我还发现插入操作的目标是默认值:

h.default # => ['b','c']
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个解释为什么它不起作用,以及如何以最佳方式做到这一点,所以它的工作原理.

Ser*_*sev 7

你的行不起作用的原因是Hash在访问一个丢失的键时,只返回默认值(无论你指定的是什么),而不将其分配给键.并且由于您的默认值是一个复杂的可变对象(并且它是每次返回的完全相同的对象),因此您可以得到您所观察到的内容:所有值都被直接铲入默认值,绕过哈希值.这可能是散列和可变默认值最常见的错误.

要做你想做的事,请使用第三种形式的Hash.new

new {|hash, key| block } ? new_hash
Run Code Online (Sandbox Code Playgroud)

例如,像这样

h = Hash.new {|h, k| h[k] = [] }
Run Code Online (Sandbox Code Playgroud)