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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。