Code Fix

初級

ArgumentError: wrong number of arguments の原因と直し方

メソッドが必要とする数と異なる数の引数を渡すと、ArgumentErrorになります。デフォルト値の無い引数を渡し忘れたり、余分な引数を渡したりすると発生します。

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

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

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

パターン1

 1  def multiply(a, b)
 2    a * b
 3  end
 4  puts multiply(4   )
                    ^
main.rb:1:in `multiply': wrong number of arguments (given 1, expected 2) (ArgumentError) from main.rb:4:in `<main>'

multiplyは引数を2つ必要としますが、1つしか渡していません。デフォルト値の無い引数は省略できません。

直し方: (空), 6 にします。

この問題を解いてみる →

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

パターン2

 1  def greet(name, greeting)
 2    "#{greeting}, #{name}!"
 3  end
 4  puts greet("Taro"         )
                         ^
main.rb:1:in `greet': wrong number of arguments (given 1, expected 2) (ArgumentError) from main.rb:4:in `<main>'

2番目の引数を渡し忘れると、その場でArgumentErrorになります。nilで自動的に補われることはありません。

直し方: (空), "Hello" にします。

この問題を解いてみる →

パターン3

 1  def area(width, height)
 2    width * height
 3  end
 4  puts area(5   )
                ^
main.rb:1:in `area': wrong number of arguments (given 1, expected 2) (ArgumentError) from main.rb:4:in `<main>'

引数の数が定義と一致しないと、メソッドの中身が実行される前にエラーになります。

直し方: (空), 4 にします。

この問題を解いてみる →

パターン4

 1  def full_name(first, last)
 2    "#{first} #{last}"
 3  end
 4  puts full_name("Taro", "Yamada", "extra")
                                       ^
main.rb:1:in `full_name': wrong number of arguments (given 3, expected 2) (ArgumentError) from main.rb:4:in `<main>'

引数が多すぎる場合もArgumentErrorになります。余分な引数を黙って無視することはありません。

直し方: , "extra"(空) にします。

この問題を解いてみる →

パターン5

 1  def subtract(a, b)
 2    a - b
 3  end
 4  puts subtract(10   )
                     ^
main.rb:1:in `subtract': wrong number of arguments (given 1, expected 2) (ArgumentError) from main.rb:4:in `<main>'

呼び出し時に渡す引数の数は、メソッド定義の引数の数と正確に一致させる必要があります。

直し方: (空), 4 にします。

この問題を解いてみる →

よくある誤解

「足りない引数はnilで自動的に補われるはず」という思い込みは誤りです。デフォルト値が定義されていない引数を省略すると、その場でArgumentErrorになります。

まとめ

ArgumentError: wrong number of argumentsは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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