Code Fix

初級

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になります。宣言不要なのは型だけで、最初の代入自体は必要です。

実務での勘所

このエラー文が「undefined local variable or method」と両方の可能性を併記しているのには理由があります。Rubyの構文上、fooという裸の識別子だけでは、それが引数無しのメソッド呼び出しなのか、ローカル変数への参照なのかを見た目だけで区別できません。実際にRubyの構文解析は、その名前が過去にその場所より前で代入された形跡があるかどうかを手がかりに、ローカル変数として扱うかメソッド呼び出しとして扱うかを決めています。どちらの可能性も否定できないため、エラーメッセージは両方を候補として提示します。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)