ruby - hash值与 `<<`算子的交互

标签 ruby hash

<分区>

我预计:

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/

相关文章:

ruby - 无法从 Ruby 脚本创建 EXE 文件

java - 如何查找哪个memcached服务器存储哪个键值对

python - 在 Python 中通过字典进行枚举

ruby - 数组转换为哈希

ruby - 如何在一行中更改方法的结果?

Ruby 紧凑的赋值语法

ruby-on-rails - Sidekiq 和 rails 4 actionmailer 从不发送电子邮件

ruby-on-rails - 在运行时生成新模型和模式

ruby - Ruby 哈希上的多字符串元素排序,第一个键降序,第二个键升序

swift - 相等是否意味着哈希值相等?