概要
Ruby初心者の私が、ここ最近勉強中に何度も発生させてしまったエラーについて書きました。
難しいエラー内容ではないかと思いますが、なんか前もこのエラー出たな。。。となったので、備忘録として残すことにしました。
エラー再現コード
numbers = 1..5
numbers.each do |number|
# 1~5まで順に足しあげながら繰り返し処理する
sum += number
puts sum
end
エラー内容
「+」 メソッドは、nilクラスに定義されていませんという意味のエラーメッセージ。
$ undefined method `+' for nil:NilClass (NoMethodError)
「-」の場合も発生しました。
$ undefined method `-' for nil:NilClass (NoMethodError)
原因と解決策
-
原因
eachメソッドのブロック内の変数sumを、メソッド外で定義していないため。 -
解決策
eachメソッド外部で、変数sumの初期値を0として定義してあげる。
numbers = 1..5
+ sum = 0
numbers.each do |number|
# 1~5まで順に足しあげながら繰り返し処理する
sum += number
puts sum
end
実行結果.rb
1 # 0 + 1
3 # 1 + 2
6 # 3 + 3
10 # 以下省略
15
変数の定義が必要なら、ブロック内に記載すれば良いのではないか?と考えました。
しかしながら、その方法では繰り返し処理をする毎にsumが0になるため、足し上げ不可能となりました。
失敗.rb
numbers = 1..5
numbers.each do |number|
# 1~5まで順に足しあげていく
sum = 0
sum += number
puts sum
end
実行結果_失敗.rb
1
2
3
4
5
終わりに
eachメソッドに限らず、同じクラス内のメソッドにて足し上げ処理を書こうとした際、変数の定義・初期化のし忘れをしてしまい、今回と同様のエラーに再会しました…
その時に、あ〜これ前もやったやつだと気付き、無事解決することができました。
同じ状況になっている方の参考になれば幸いです。