NameError: undefined local variable or method の原因と直し方
宣言・代入していない変数名を参照したときに出るエラーです。変数名のタイプミスのほか、代入する前に参照してしまったときにも起こります。
エラーメッセージの読み方
main.rb:2:in `<main>': undefined local variable or method `pricee' for main (NameError)
main.rb- ファイル名
2- 行番号 — 実際にクラッシュした行
<main>- 発生場所 — <main> ならトップレベル、メソッド名ならそのメソッドの中
NameError- 例外クラス — 何が起きたか。ここを検索するのが最短です
undefined local variable or method `pricee' for main- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 price = 1000 2 puts pricee ^
main.rb:2:in `<main>': undefined local variable or method `pricee' for main (NameError)
priceとpriceeは1文字違うだけでも別の名前です。Rubyは似た名前を推測して補ってはくれません。
直し方: pricee を price にします。
広告
広告スロット(未設定)
パターン2
1 score = 88 2 puts scroe ^
main.rb:2:in `<main>': undefined local variable or method `scroe' for main (NameError)
文字の順番が入れ替わったタイプミスも、Rubyには全く別の変数名として見えます。
直し方: scroe を score にします。
パターン3
1 total = 250 2 puts totall ^
main.rb:2:in `<main>': undefined local variable or method `totall' for main (NameError)
1文字多いだけでも一致しない名前として扱われ、代入されたことのない変数の参照になります。
直し方: totall を total にします。
パターン4
1 username = "kenji" 2 puts usrname ^
main.rb:2:in `<main>': undefined local variable or method `usrname' for main (NameError)
母音が抜けたタイプミスも、Rubyにとっては全く別の名前です。
直し方: usrname を username にします。
パターン5
1 temperature = 25 2 puts temprature ^
main.rb:2:in `<main>': undefined local variable or method `temprature' for main (NameError)
長い変数名ほどタイプミスに気づきにくくなります。一度代入した名前と完全に一致しているか確認してください。
直し方: temprature を temperature にします。
よくある誤解
「Rubyは変数を使う前に宣言しなくていい」と思っていても、一度も代入されていない名前を参照すればNameErrorになります。宣言不要なのは型だけで、最初の代入自体は必要です。
まとめ
NameError: undefined local variable or methodは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。