<分区>
我预计:
h = Hash.new([])
h['a'] << 'b'
h['a'] << 'c'
h # => {}
给出 {'a' => ['b','c']}
,而不是空哈希。
我还发现插入操作的目标是默认值,因为在上面的代码之后它等于 ['b','c']
:
h.default # => ['b','c']
我正在寻找有关为什么它不起作用以及如何以最佳方式做到这一点的解释。
<分区>
我预计:
h = Hash.new([])
h['a'] << 'b'
h['a'] << 'c'
h # => {}
给出 {'a' => ['b','c']}
,而不是空哈希。
我还发现插入操作的目标是默认值,因为在上面的代码之后它等于 ['b','c']
:
h.default # => ['b','c']
我正在寻找有关为什么它不起作用以及如何以最佳方式做到这一点的解释。
最佳答案
您的线路无法正常工作的原因是 Hash ,在访问丢失的键时,只需返回默认值(无论您指定什么),而不将其分配给键。由于您的默认值是一个复杂的可变对象(并且它是每次返回的同一个对象),您得到了您观察到的结果:所有值都被直接铲入默认值,绕过散列。这可能是哈希和可变默认值最常见的错误。
做你想做的,用Hash.new的第三种形式
new {|hash, key| block } → new_hash
比如这样
h = Hash.new {|h, k| h[k] = [] }
关于ruby - hash值与 `<<`算子的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53614261/