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という名前のメソッドは存在しません。

直し方: capitalise を capitalize にします。

この問題を解いてみる →

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

パターン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は似た名前を推測して実行してはくれません。

直し方: reeverse を reverse にします。

この問題を解いてみる →

パターン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の順番を間違えるのはよくあるタイプミスです。

直し方: lenght を length にします。

この問題を解いてみる →

パターン4

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

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

直し方: fisrt を first にします。

この問題を解いてみる →

パターン5

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

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

直し方: downcse を downcase にします。

この問題を解いてみる →

よくある誤解

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

実務での勘所

「似た名前を推測して実行してはくれない」というのはRubyの既定の挙動であり、絶対的な制約ではありません。Rubyにはmethod_missingという仕組みがあり、クラス側でこれを定義しておけば、存在しないメソッド名の呼び出しを動的に処理できます。実際にRailsのActiveRecordはfind_by_nameのような、事前に定義されていないメソッド名をmethod_missing経由で解釈し、動的にデータベース検索を組み立てています。既定では厳格にエラーになるという安全側の挙動と、望むクラスだけが動的な振る舞いを選べる柔軟性を、Rubyは両立させています。

演習をはじめる

関連するエラー

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