【Ruby】よくあるRubyエラーの読み方(NoMethodError等)

Ruby

こんにちは、かつコーチです。

Rubyを書き始めると、赤い文字でずらずらと表示されるエラーメッセージに戸惑う方が多いと思います。

私も学習を始めたころは、エラーが出るたびに「うわ、また落ちた」と手を止めていました。

でも実はRubyのエラーメッセージは、原因の手がかりを丁寧に教えてくれる親切な仕組みです。

この記事では、初心者がよく出会う代表的なエラーを、Before/Afterの形で分かりやすく解説します。

基本の書き方・エラーメッセージの読み方

エラーメッセージの構造を理解する

Rubyのエラーメッセージは、大きく3つの情報で構成されています。

  • エラー箇所:どのファイルの何行目で起きたか
  • エラークラスNoMethodErrorNameErrorなどのエラーの種類
  • エラー内容:具体的に何が問題だったかの説明
sample.rb:3:in '<main>': undefined method 'upcase' for nil (NoMethodError)

このメッセージは「sample.rbの3行目で、nilに対してupcaseメソッドを呼び出そうとしたけど、そんなメソッドはない」という意味です。

つまずきやすい読み方のポイント

エラーメッセージは英語なので、つい読み飛ばしてしまいがちです。

しかし焦って全部を無視するのではなく、まず行番号エラークラス名の2つだけを確認する習慣をつけましょう。

行番号が分かれば該当箇所を特定でき、エラークラス名が分かれば原因の種類が絞り込めます。

よくあるつまずきポイント・エラー対処

NoMethodError:存在しないメソッドを呼んでいる

NoMethodErrorとは、オブジェクトに存在しないメソッドを呼び出したときに発生するエラーです。

❌ Before

name = "katsu"
puts name.reverse!.uppercase
undefined method 'uppercase' for "usztak" (NoMethodError)

私が実際にハマったのは、upcaseと書くつもりでuppercaseとタイプミスしたケースです。

英語圏の感覚だとuppercaseの方が自然に見えて、しばらく気づけませんでした。

✅ After

name = "katsu"
puts name.reverse.upcase
# => "USZTAK"

undefined methodの後ろに書かれているメソッド名を、まずスペルミスがないか確認するのが基本です。

NameError:定義されていない変数を参照している

NameErrorとは、定義されていない変数や定数を参照したときに発生するエラーです。

❌ Before

user_name = "Sato"
puts usre_name
undefined local variable or method 'usre_name' (NameError)

これも変数名のタイプミスが原因です。

user_nameusre_nameのように、文字の並びが入れ替わっているだけだと目視で気づきにくくなります。

✅ After

user_name = "Sato"
puts user_name
# => "Sato"

エディタの入力補完を使うと、こうした綴りミスをかなり防げます。

SyntaxError:構文の書き方が間違っている

SyntaxErrorとは、Rubyの文法ルールに反したコードを書いたときに発生するエラーです。

❌ Before

def greet(name)
  puts "Hello, #{name}"
end

greet("Katsu"
sample.rb:6: syntax error, unexpected end-of-input, expecting ')'

閉じカッコを1つ書き忘れただけで、こうしたエラーになります。

✅ After

def greet(name)
  puts "Hello, #{name}"
end

greet("Katsu")

unexpected end-of-inputと表示されたら、カッコやendの数が合っているか確認しましょう。

ArgumentError:引数の数が合っていない

ArgumentErrorとは、メソッドに渡す引数の数が定義と合っていないときに発生するエラーです。

❌ Before

def add(a, b)
  a + b
end

add(1, 2, 3)
wrong number of arguments (given 3, expected 2)

メソッドの定義側では引数が2つなのに、呼び出し側で3つ渡してしまっている状態です。

✅ After

def add(a, b)
  a + b
end

add(1, 2)
# => 3

given(渡した数)とexpected(期待される数)を見比べれば、原因はすぐに特定できます。

まとめ

この記事のポイント

  • Rubyのエラーメッセージは行番号・エラークラス名・エラー内容の3点で構成される
  • NoMethodErrorは存在しないメソッド呼び出し、NameErrorは未定義の変数参照が原因になりやすい
  • SyntaxErrorはカッコやendの対応漏れ、ArgumentErrorは引数の数の不一致が典型パターンである
  • エラー文をすべて読もうとせず、まず行番号とエラークラス名から手がかりを探すとよい

次に読むべき記事

エラーの読み方が分かったら、次はnilにまつわるエラーへの対処法を押さえておきましょう。

「nilの扱い方でハマらないために」で、NoMethodError for nil:NilClassの具体的な防ぎ方を解説しています。

タグ: #Ruby #初心者向け #エラー解決

タイトルとURLをコピーしました