`charged': undefined method `+' for nil:NilClass (NoMethodError)について

初めに

  • 学習中に起こったエラーについて記述していきます。

やりたいこと

  • イカのカードにお金をチャージして残高確認を行う。

  • charged': undefined method+' for nil:NilClass (NoMethodError)の解消

コードと解説

修正前コード

class Suica
  attr_accessor :money ,:charge

  def initialize
    @money = money 
    @charge = charge
  end

  def charged(charge)
    @money += charge
  end
end

suica = Suica.new
p suica.charged(100)
  • Suicaクラスを作成。

  • attr_accessorメソッドを使用してmoney,chargeをゲッター、セッターメソッドとして定義する。

  • initializeメソッドで@money,@chargeを初期化

  • chargedメソッドでsuicaにお金をチャージするメソッドを定義。

  • chargeを引数として渡して、@moneyにcharge分の金額がチャージされるメソッドにする。

  • エラー内容より、chargeメソッドの'+'が定義されていない。nilクラス。

  • Nomethod Errorの原因としてはメソッドの打ち間違え、privateメソッドをクラス外から呼び出そうとしている。レシーバークラスが想定していた型と異なる。レシーバーが想定に反してnilになっている。

  • 今回は@moenyに原因があると考えられた。


修正後のコード

class Suica
  attr_accessor :money ,:charge

  def initialize(money = 0)
    @money = money 
    @charge = charge
  end

  def charged(charge)
    @money += charge
  end
end

suica = Suica.new
p suica.charged(100)
  • moneyの初期値に具体的な数値を設定していなかったので追加。

  • initializeメソッドの引数に初期値money = 0を渡した。オブジェクトを呼び出す際に引数を記述する必要はない。

結語

  • NomethodErroroは存在しないメソッドや可視性が制限されているため呼び出せないメソッドを呼び出そうとした場合に発生するエラー。

  • 今回はチャージ金額の初期値が設定されていないので+がうまく機能せずにエラーとなった。