Ruby带默认值的哈希使用疑问:Hash.new(0)为何返回空哈希
Ruby
Hash.new(0) 行为答疑 你观察到的irb返回空哈希{}的现象是完全符合Ruby设计的,核心误解出在对「哈希默认值」作用的理解上:
Hash.new传入的参数是访问不存在的键时的返回值,既不是预填充的键值对,也不会自动加入哈希的实际存储结构,因此不会出现你想象的{0=>0}结构。
行为验证示例
# 初始化带默认值0的空哈希 count = Hash.new(0) # 直接打印哈希,确实没有任何键值对 p count # 输出 {} # 访问不存在的键:test,返回默认值0,但哈希本身不会发生变化 p count[:test] # 输出 0 p count # 仍然输出 {}
作为累加器的工作逻辑
这个默认值0的设计确实非常适合做累加场景(比如词频统计),原理如下:count[x] += 1 等价于 count[x] = count[x] + 1
- 第一次访问不存在的键
x时,等号右侧的count[x]会返回默认值0 - 计算得到
0+1=1后,赋值操作会主动把x => 1写入哈希 - 后续再访问
x就会直接读取哈希中存储的实际值,不再走默认值逻辑
只有触发赋值操作时,对应的键值对才会被真正存入哈希,单纯读取不存在的键只会返回默认值,不会修改哈希本身。
内容的提问来源于stack exchange,提问作者Fabio Andres
相关产品推荐
相关产品推荐

