我期望:
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)
我正在寻找一个解释为什么它不起作用,以及如何以最佳方式做到这一点,所以它的工作原理.
你的行不起作用的原因是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)
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |