メソッドに渡す引数の数が定義と合わないときのエラーです。定義と呼び出しを揃えます。
raise ArgumentErrorで自分のコードが意図的に発生させているdef add(a, b)
a + b
end
puts add(3)
def add(a, b)
a + b
end
puts add(3, 4) # 7
# 引数を省略可能にするなら既定値
def add2(a, b = 0)
a + b
end
puts add2(3) # 3
▶ 修正済みコードを実行エディタで開く
「given 1, expected 2」は「1個渡したが2個必要」の意味です。「given 3, expected 2」なら逆に渡しすぎです。メソッド定義の引数と、呼び出し側の引数の数を一致させます。省略できるようにするにはdef add(a, b = 0)のように既定値を付けます。
given 1, expected 2 … 1個渡したが2個必要(足りない)given 3, expected 2 … 3個渡したが2個まで(多すぎ)given 3, expected 1..2 … 1〜2個の範囲。既定値付き引数があると範囲表記になるgiven 1, expected 2+ … 2個以上必要(*rest のような可変長を含む)メソッド定義の def name(...) の括弧内を見て、必須引数の数と既定値付き引数の有無を数えれば expected の値と一致します。
キーワード引数を使うメソッドで不足すると 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
▶ キーワード引数のコードを実行エディタで開く
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(a, b) と明示します。
組み込みの引数チェック以外に、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のコードを実行エディタで開く