Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 无法为哈希值操作使用每个到_Ruby - Fatal编程技术网

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}
so
newer。每个
将调用块
{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}
    

    由于
    较旧的
    不包含
    较新的
    中的所有键,因此它无法按预期工作

    newer
    由两个键值对组成:
    {emeralds:27,moonstones:5}
    so
    newer。每个
    将调用块
    {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
    。这就是错误消息告诉您的。您希望在这里看到什么结果?我可以帮助“修复”代码,但不能不知道所需的行为!这种方法显然过于简单,无法正确处理所有情况。如果我是你,我会检查基本概念,并尝试提出一种更合适的表示库存的方法,而不是使用哈希