ruby - 默认使用空数组初始化 Ruby 哈希
问题描述
当我使用 0 之类的默认值初始化 Ruby 哈希并在哈希中创建一个新条目并递增时,它的行为符合预期:
irb(main):001:0> h1 = Hash.new(0)
=> {}
irb(main):002:0> h1[:foo] += 1
=> 1
irb(main):003:0> h1
=> {:foo=>1}
irb(main):004:0> h1[:foo]
=> 1
注意如何h1 #=> {:foo=>1}
和h1[:foo] #=> 1
。这就是我期待看到的。
除非我使用空数组的默认值,否则会发生以下情况:
irb(main):005:0> h2 = Hash.new([])
=> {}
irb(main):006:0> h2[:foo] << "cats"
=> ["cats"]
irb(main):007:0> h2
=> {}
irb(main):008:0> h2[:foo]
=> ["cats"]
注意如何h2 #=> {}
和h2[:foo] #=> ["cats"]
。我不知道为什么会这样。
- 这里发生了什么?
- 为什么 h2 看起来像一个空的散列,但仍然有一个带有 key 的值
:foo
?
如果我使用一些块,那么会发生预期的行为:
irb(main):001:0> h3 = Hash.new {|hash, key| hash[key] = [] }
=> {}
irb(main):002:0> h3[:foo] << "cats"
=> ["cats"]
irb(main):003:0> h3
=> {:foo=>["cats"]}
irb(main):004:0> h3[:foo]
=> ["cats"]
注意如何h2 #=> {:foo=>["cats"]}
和h3[:foo] #=> ["cats"]
。这就是我期待看到的。
解决方案
答案在Hash.new
. _ 简而言之:
如果指定了 obj (
[]
在您的情况下),则此单个对象将用于所有默认值。如果指定了一个块,它将使用哈希对象和键调用,并且应该返回默认值。如果需要,将值存储在散列中是块的责任。
使用块初始化以设置非零默认值。
推荐阅读
- c# - 当在另一个类方法中将对象作为参数传递而没有单词 ref 时,对象属性会发生变化。
- chart.js - 填充和折线组合的折线图
- java - 如何对我的 ES 服务执行单元测试?
- javascript - 在javascript按钮单击中读取GridMVC选择行
- mysql - Django 在 mysql 中显示 bigint 时舍入 3 位数字
- r - data.table::fread 的控制字符问题(插入符号)
- python - 如何在 CDAP python 转换中添加 python 库?
- jenkins - Jenkins 中 groovy 使用的路径中的 UTF-8 字符
- python - Dask 计算给出 AttributeError:“系列”对象没有属性“编码”
- apache-spark - 如何重新分区 Spark DStream Kafka ConsumerRecord RDD