ホーム › エラー解決 › Ruby › ArgumentError(引数の数)
Ruby ERROR

Ruby ArgumentError: wrong number of arguments の解決法

メソッドに渡す引数の数が定義と合わないときのエラーです。定義と呼び出しを揃えます。

このエラーメッセージ

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

原因

❌ エラーになるコード

NG
def add(a, b)
  a + b
end
puts add(3)

✅ 修正したコード

OK
def add(a, b)
  a + b
end
puts add(3, 4)   # 7

# 引数を省略可能にするなら既定値
def add2(a, b = 0)
  a + b
end
puts add2(3)     # 3
▶ 修正済みコードを実行エディタで開く
progoのRuby実行環境(インストール不要・登録不要)でその場で動作を確認できます。

解決のポイント

「given 1, expected 2」は「1個渡したが2個必要」の意味です。「given 3, expected 2」なら逆に渡しすぎです。メソッド定義の引数と、呼び出し側の引数の数を一致させます。省略できるようにするにはdef add(a, b = 0)のように既定値を付けます。

given / expected の読み方

メソッド定義の def name(...) の括弧内を見て、必須引数の数と既定値付き引数の有無を数えれば expected の値と一致します。

キーワード引数が足りない(missing keyword)

キーワード引数を使うメソッドで不足すると ArgumentError: missing keyword: :name になります。呼び出し側で キー: 値 の形を揃えます。余分に渡すと unknown keyword です。

def greet(name:, lang: "ja")
  "#{lang}: #{name}"
end
puts greet(name: "progo")          # ja: progo
puts greet(name: "progo", lang: "en")  # en: progo
▶ キーワード引数のコードを実行エディタで開く
progoのRuby実行環境(インストール不要・登録不要)でその場で確認できます。

個数を固定したくない場合

def total(*nums)        # 可変長:0個以上を配列で受け取る
  nums.sum
end
puts total(1, 2, 3)     # 6
puts total              # 0

arr = [1, 2, 3]
puts total(*arr)        # 配列を展開して渡す → 6

**opts なら任意のキーワード引数をハッシュで受け取れます。ブロックを受けるなら &block。

super で出るケース

引数なしの super は「今のメソッドと同じ引数」を親に渡します。親の引数の数が違うときは super()(空括弧)や super(a, b) と明示します。

raise ArgumentError で自分から発生させる

組み込みの引数チェック以外に、raise ArgumentError, "メッセージ"で自分のコード内から意図的にArgumentErrorを送出できます。不正な値を早期に弾きたいときに使います。

def set_age(age)
  raise ArgumentError, "ageは0以上にしてください" if age < 0
  @age = age
end

begin
  set_age(-5)
rescue ArgumentError => e
  puts "エラー: #{e.message}"
end
▶ raise ArgumentErrorのコードを実行エディタで開く
progoのRuby実行環境(インストール不要・登録不要)でその場で動作を確認できます。

よくある質問

可変長にしたい
def method(*args) と書くと任意個の引数を配列で受け取れます。
expected 1..2 とは?
必要な引数の個数が1〜2個の範囲という意味です。既定値付き引数(b = 0 など)があると範囲表記になります。
missing keyword: :name と出る
キーワード引数が不足しています。呼び出し側で name: 値 の形を渡します。余分だと unknown keyword になります。
キーワード引数でも出る?
はい。required keyword が不足するとArgumentErrorになります。
配列をそのまま渡したい
method(*arr) のように * を付けて展開して渡します。ハッシュは ** を使います。
raise ArgumentErrorはどう使う?
raise ArgumentError, "メッセージ" と書くと、自分のコード内で不正な引数を検知した際に意図的にエラーを発生させられます。begin/rescueで捕捉可能です。