0

次のコードがエラーを返す理由は誰にも分かりますか?

stock = {"M9788375085969"=>5, "M9788392289760"=>5, "M9788389371461"=>1, "M9788389371447"=>3, "M9788392289761"=>2}
add = {"M9788375085969"=>1, "M9788392289760"=>2, "NEW9788392289753"=>1 }

add.each do |key, value|
  stock[key] += value
end

NoMethodError: undefined method `+' for nil:NilClass

同様のことがうまくいきますが:

key = "M9788375085969"
value = 1
stock[key] += value
=> 6
4

4 に答える 4

3

addハッシュに欠落しているキーが 1 つありますstock: "NEW9788392289753"。

を実行すると、キーがマップされていないためstock["NEW9788392289753"]nilが返されます。

于 2013-11-08T14:38:26.660 に答える
2

キー"NEW9788392289753"はハッシュには存在しませんが、ハッシュstockには存在しaddます。下記参照 :

stock = {"M9788375085969"=>5, "M9788392289760"=>5, "M9788389371461"=>1, "M9788389371447"=>3, "M9788392289761"=>2}
stock['NEW9788392289753'] # => nil
nil.respond_to?(:+) # => false # means NilClass don't has method called :+

したがってnil.+(value)、有効なエラーがスローされます。以下のようにしてください:

stock = {"M9788375085969"=>5, "M9788392289760"=>5, "M9788389371461"=>1, "M9788389371447"=>3, "M9788392289761"=>2}
add = {"M9788375085969"=>1, "M9788392289760"=>2, "NEW9788392289753"=>1 }

add.each do |key, value|
  p stock[key] += value if stock.has_key?(key) # it will take care of the error.
end

出力

6
7

OPのコメントに従って、私は次のようにします:

add.each do |key, value|
  if stock.has_key?(key) 
     stock[key] += value 
  else
     stock[key] = value
  end
end
于 2013-11-08T14:38:09.397 に答える
2

NEW9788392289753からのキーaddが に含まれていないためstockです。

于 2013-11-08T14:39:30.430 に答える
1

存在しないキーを処理する別の方法は、デフォルトのゼロを提供することです。

stock = {"M9788375085969"=>5, "M9788392289760"=>5, "M9788389371461"=>1, "M9788389371447"=>3, "M9788392289761"=>2}
add = {"M9788375085969"=>1, "M9788392289760"=>2, "NEW9788392289753"=>1 }

stock.default = 0 

add.each do |key, value|
  stock[key] += value
end

p stock #=> {"M9788375085969"=>6, "M9788392289760"=>7, "M9788389371461"=>1, "M9788389371447"=>3, "M9788392289761"=>2, "NEW9788392289753"=>1}
于 2013-11-08T16:16:54.313 に答える