Ruby 引数の渡し方
用語
- 仮引数(parameter)
メソッド定義の時に使用される引数。
def hoge(x, y); end
のx
, y
が仮引数
- 実引数(argument)
メソッド使用時に引き渡す引数。
hoge(1, 'arg')
の1
, arg
が実引数。
基本
実引数と仮引数は前から順番に結び付けられていく。それぞれ数が一致していないとエラーになる。
> def basic(arg1, arg2)
> p arg1
> p arg2
> end
# 実引数と仮引数の数が一致
> basic('1', '2')
"1"
"2"
# 実引数が足りないとエラー
> basic('1')
ArgumentError: wrong number of arguments (1 for 2)
# 実引数が多すぎるとエラー
> basic('1', '2', '3')
ArgumentError: wrong number of arguments (3 for 2)
デフォルト値
引数にはデフォルト値をセットすることができる。デフォルト値のついていない引数については基本の場合と同様に、前から順番に実引数と仮引数が結び付けられていく。
実引数の数が仮引数より足りないとき、残りの仮引数に対してデフォルト値がセットされていればその値が使われる。
デフォルト値のない仮引数に対応する実引数がなかった場合は基本の場合と同様にエラーが発生する。
> def default(arg1, arg2, arg3='default')
> p arg1
> p arg2
> p arg3
> end
# 実引数の数と仮引数の数が一致
> default('1', '2', '3')
"1"
"2"
"3"
# 実引数の数が足りないときは、デフォルト値が使われる
> default('1', '2')
"1"
"2"
"default"
# デフォルト値の無い仮引数に実引数が与えられないときはエラー
> default('1')
ArgumentError: wrong number of arguments (1 for 2..3)
最後の例からわかるように、default
メソッドは2から3個の引数を受けるメソッドになる。
キーワード引数
メソッドが必要とする引数の数が増えてくると、使用側でその順番を間違えてしまうこともある。なので、順番ではなく名前で実引数と仮引数の対応をつけることができる。
> def keyword(arg1:, arg2:)
> p arg1
> p arg2
> end
# キーワードつきで呼び出し
> keyword(arg1: '1', arg2: '2')
"1"
"2"
# 順番
# 実引数の数が足りない
> keyword(arg1: 1)
ArgumentError: missing keyword: arg2
# キーワードなしだと、解決できない
> keyword(1, 2)
ArgumentError: wrong number of arguments (2 for 0)
デフォルト値つきキーワード引数
キーワード引数にもデフォルト値をつけることができる。
> def keyword_and_default(arg1: 'default1', arg2: 'default2')
> p arg1
> p arg2
> end
# ↑2つの挙動がミックスされる
> keyword_and_default(arg1: '1')
"1"
"default"