Ruby の引数の種類について調べてみました。
早見表
全部まとめた表です
キーワード | 説明 | 例 |
---|---|---|
req | 必須の引数 | func(val) |
opt | デフォルト値が指定されたオプショナルな引数 | func(val = 3) |
rest |
* で指定された残りすべての引数 |
func(*val) |
block |
& で指定されたブロック引数 |
func(&block) |
key | デフォルト値が指定されたオプショナルなキーワード引数 | func(val: 3) |
keyreq | 必須のキーワード引数 | func(val:) |
keyrest |
** で指定された残りのキーワード引数 |
func(**val) |
req
一番良く見る定義。引数が与えられていない場合はエラーが出る。
def func(val)
p val
end
func(3) #=> 3
func #=> ArgumentError
opt
引数に対してデフォルト値を設定出来る。メソッド呼び出し時に引数が指定されていない場合はデフォルト値が採用される。
def func(val = 1)
p val
end
func(3) #=> 3
func #=> 1
rest
変数名の前にsplat演算子 *
を置くことで、渡した引数を配列で全て受け取ることが出来る。
def func(*val)
p val
end
func(1, 2, 3) #=> [1, 2, 3]
func #=> []
他の引数が存在している場合は、それらを処理してその後いい感じに残ったやつをうまく受け取ってくれる。
def func(a, *val)
p [a, val]
end
func(1, 2, 3) #=> [1, [2, 3]]
func(1) #=> [1, []]
def func(a, *val, b)
p [a, val, b]
end
func(1, 2, 3, 4, 5) #=> [1, [2, 3, 4], 5]
block
メソッド呼び出しの後ろにブロック文を定義することで、その処理を渡すことが出来る。
def func(&block)
p block.call(3)
end
func { |x| x * x } #=> 9
yield
でも呼び出すことが出来る。
def func(&block)
p yield 3
end
func { |x| x * x } #=> 9
block が渡されたかどうかは block_given?
を使って調べることが出来る。
def func(&block)
p block_given?
end
func { |x| x * x } #=> true
func #=> false
key
2.0 から導入されたキーワード引数。2.0 ではデフォルト値が必要。
def func(val: 3)
p val
end
func(val: 1) #=> 1
func #=> 3
keyreq
2.1 からデフォルト値をつけなくても定義出来るようになりました。
def func(val:)
p val
end
func(val: 1) #=> 1
keyrest
splat演算子 *
を2つ連続でつなげることで、残りのハッシュを全て受け取ることが出来る。個人的には一番見かける機会が少ない引数。
def func(a, **hash)
p [a, hash]
end
func(1, a: 2, b: 3) #=> [1, {:a=>2, :b=>3}]
余談
今回は割愛しましたが、ブロックの引数に対しても同じように適用できます。
def func(&block)
yield(1, 2, 3)
end
func { |*x| p x } #=> [1, 2, 3]
def func(&block)
yield('hoge', a: 1,b: 2,c: 3)
end
func { |a, **x| p [a, x] } #=> ["hoge", {:a=>1, :b=>2, :c=>3}]