LoginSignup
5
4

More than 5 years have passed since last update.

Ruby の引数の種類

Posted at

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}]

参考サイト

5
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4