Code Fix

初級

メソッド名のタイプミスによる NoMethodError

存在しない名前のメソッドを呼び出したときに出るエラーです。メソッド名を1文字でも間違えると、Rubyは似た名前を推測して実行してはくれず、その場でエラーになります。

エラーメッセージの読み方

main.rb:2:in `<main>': undefined method `capitalise' for an instance of String (NoMethodError)
main.rb
ファイル名
2
行番号 — 実際にクラッシュした行
<main>
発生場所 — <main> ならトップレベル、メソッド名ならそのメソッドの中
NoMethodError
例外クラス — 何が起きたか。ここを検索するのが最短です
undefined method `capitalise' for an instance of String
詳細メッセージ — どの値が問題だったか

このエラーが出る典型パターン

パターン1

 1  name = "alice"
 2  puts name.capitalise
                   ^
main.rb:2:in `<main>': undefined method `capitalise' for an instance of String (NoMethodError)

Rubyのcapitalizeはアメリカ英語のスペルです。イギリス英語のcapitaliseという名前のメソッドは存在しません。

直し方: capitalisecapitalize にします。

この問題を解いてみる →

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

パターン2

 1  nums = [3, 1, 2]
 2  puts nums.sort.reeverse.inspect
                       ^
main.rb:2:in `<main>': undefined method `reeverse' for an instance of Array (NoMethodError)

メソッド名を1文字でも間違えると、Rubyは似た名前を推測して実行してはくれません。

直し方: reeversereverse にします。

この問題を解いてみる →

パターン3

 1  text = "hello world"
 2  puts text.lenght
                 ^
main.rb:2:in `<main>': undefined method `lenght' for an instance of String (NoMethodError)

lengthのgとhの順番を間違えるのはよくあるタイプミスです。

直し方: lenghtlength にします。

この問題を解いてみる →

パターン4

 1  list = [1, 2, 3]
 2  puts list.fisrt
                ^
main.rb:2:in `<main>': undefined method `fisrt' for an instance of Array (NoMethodError)

文字の入れ替わったタイプミスは見た目が似ているぶん、コードを読んだだけでは気づきにくいです。

直し方: fisrtfirst にします。

この問題を解いてみる →

パターン5

 1  word = "RUBY"
 2  puts word.downcse 
                  ^
main.rb:2:in `<main>': undefined method `downcse' for an instance of String (NoMethodError)

エラーメッセージに出るメソッド名を1文字ずつ確認すれば、タイプミスの箇所を特定できます。

直し方: downcsedowncase にします。

この問題を解いてみる →

よくある誤解

「大文字小文字やアンダースコアの位置くらいなら合わせてくれるはず」という思い込みは誤りです。メソッド名は完全に一致していないと別の名前として扱われます。

まとめ

メソッド名のタイプミスによる NoMethodErrorは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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