无法使用.each操作哈希值?合并新旧哈希遇nil类方法报错怎么办?
搞定哈希合并报错 & 澄清哈希
.each方法的使用 嘿,先纠正一个小误解:Ruby里的哈希完全支持用.each遍历操作,你代码里的newer.each其实已经在正常执行了,这次的报错和.each本身没啥关系~
接下来看看你遇到的核心问题:合并哈希时出现undefined method '+' for nil:NilClass错误。
报错原因分析
问题出在older[x] += y这一行:当newer里的键(比如你例子中的:moonstones)在older哈希里不存在时,older[x]会返回nil,而nil是不能调用+方法的,所以就抛出了这个错误。
解决方案
这里给你两种常用的解决办法:
方案1:用fetch给不存在的键设默认值
在做加法前,先确保older[x]有一个初始值(比如0),可以用哈希的fetch方法:
def update_inventory(older, newer) newer.each { |item, count| older[item] = older.fetch(item, 0) + count } end
测试你的示例代码:
update_inventory({rubies: 10, emeralds: 14, diamonds: 2}, {emeralds: 27, moonstones: 5}) # 结果:{:rubies=>10, :emeralds=>41, :diamonds=>2, :moonstones=>5}
fetch(item, 0)的作用是:如果older里有item这个键,就取它的现有值;没有的话就返回默认值0,这样就能顺利执行加法操作了。
方案2:用哈希内置的merge!方法(更简洁)
Ruby哈希自带了merge!方法,可以直接合并两个哈希,还能通过块定义重复键的合并逻辑:
def update_inventory(older, newer) older.merge!(newer) { |key, old_count, new_count| old_count + new_count } end
这个方法会直接修改原older哈希,如果不想改动原哈希,可以用merge(它会返回一个新的合并后的哈希)。运行你的示例,结果和上面完全一致。
额外小提示
如果你的Ruby版本在2.5及以上,还可以用更简洁的写法,但上面两种方案是兼容性最好、最易懂的。
内容的提问来源于stack exchange,提问作者Herbert Pan
相关产品推荐
相关产品推荐

