初めに
- 学習中に起こったエラーについて記述していきます。
やりたいこと
コードと解説
修正前コード
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は存在しないメソッドや可視性が制限されているため呼び出せないメソッドを呼び出そうとした場合に発生するエラー。
今回はチャージ金額の初期値が設定されていないので+がうまく機能せずにエラーとなった。