メソッド名のタイプミスによる 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 にします。
よくある誤解
「大文字小文字やアンダースコアの位置くらいなら合わせてくれるはず」という思い込みは誤りです。メソッド名は完全に一致していないと別の名前として扱われます。
まとめ
メソッド名のタイプミスによる NoMethodErrorは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。