Ruby 无法为哈希值操作使用每个到
为什么我不能将较新的与较旧的合并Ruby 无法为哈希值操作使用每个到,ruby,Ruby,为什么我不能将较新的与较旧的合并 def update_inventory(older, newer) newer.each {|x, y| older[x] += y} end update_inventory({rubies: 10, emeralds: 14, diamonds: 2}, {emeralds: 27, moonstones: 5}) 对于nil:NilClass (回复):2:in block inupdate\u inventory (回复):2:in每个 (回复
def update_inventory(older, newer)
newer.each {|x, y| older[x] += y}
end
update_inventory({rubies: 10, emeralds: 14, diamonds: 2}, {emeralds: 27, moonstones: 5})
对于nil:NilClass
(回复):2:in block in
update\u inventory
(回复):2:in
每个
(回复):2:in
更新库存
(回复):5:in
由于
较旧的
不包含较新的
中的所有键,因此它无法按预期工作
newer
由两个键值对组成:{emeralds:27,moonstones:5}
sonewer。每个
将调用块{x,y |…}
两次:
x
是:emerald
,而y
是27
,效果很好,因为older
具有:emerald
的值:
older[:emeralds] #=> 14
older[:emeralds] += 27 #=> 41
x
是:moonstones
和y
是5
,因此您得到:
older[:moonstones] #=> nil
older[:moonstones] += 5 #=> NoMethodError: undefined method `+' for nil:NilClass
导致此错误的原因是Ruby试图计算nil+5
,而nil
没有+
方法(因此“未定义nil的方法”+”:NilClass)要解决此问题,可以添加一个条件来检查密钥是否存在。但有一个更简单的方法:做你需要的事:
def update_inventory(older, newer)
older.update(newer) { |_, v1, v2| v1 + v2 }
end
它将把键值对从较新的复制到较旧的中。如果两个散列中都存在一个键,则将调用该块以确定新值
older = {rubies: 10, emeralds: 14, diamonds: 2}
newer = {emeralds: 27, moonstones: 5})
older.update(newer) { |_, v1, v2| v1 + v2 }
#=> {:rubies=>10, :emeralds=>41, :diamonds=>2, :moonstones=>5}
由于较旧的
不包含较新的
中的所有键,因此它无法按预期工作
newer
由两个键值对组成:{emeralds:27,moonstones:5}
sonewer。每个
将调用块{x,y |…}
两次:
在第1次迭代中,x
是:emerald
,而y
是27
,效果很好,因为older
具有:emerald
的值:
older[:emeralds] #=> 14
older[:emeralds] += 27 #=> 41
在第二次迭代中,x
是:moonstones
和y
是5
,因此您得到:
older[:moonstones] #=> nil
older[:moonstones] += 5 #=> NoMethodError: undefined method `+' for nil:NilClass
导致此错误的原因是Ruby试图计算nil+5
,而nil
没有+
方法(因此“未定义nil的方法”+”:NilClass)
要解决此问题,可以添加一个条件来检查密钥是否存在。但有一个更简单的方法:做你需要的事:
def update_inventory(older, newer)
older.update(newer) { |_, v1, v2| v1 + v2 }
end
它将把键值对从较新的复制到较旧的中。如果两个散列中都存在一个键,则将调用该块以确定新值
older = {rubies: 10, emeralds: 14, diamonds: 2}
newer = {emeralds: 27, moonstones: 5})
older.update(newer) { |_, v1, v2| v1 + v2 }
#=> {:rubies=>10, :emeralds=>41, :diamonds=>2, :moonstones=>5}
因为有一个像它所说的nil吗?older
散列不包含键::moonstones
。所以older[:moonstones]==nil
。不能添加到nil
。这就是错误消息告诉您的。您希望在这里看到什么结果?我可以帮助“修复”代码,但不能不知道所需的行为!这种方法显然过于简单,无法正确处理所有情况。如果我是你,我会检查基本概念,并尝试提出一种更合适的表示库存的方法,而不是使用哈希,因为有一个像它所说的nil?较旧的哈希不包含键::moonstones
。所以older[:moonstones]==nil
。不能添加到nil
。这就是错误消息告诉您的。您希望在这里看到什么结果?我可以帮助“修复”代码,但不能不知道所需的行为!这种方法显然过于简单,无法正确处理所有情况。如果我是你,我会检查基本概念,并尝试提出一种更合适的表示库存的方法,而不是使用哈希