Webエンジニアへの転職を目指して、現在Ruby、Railsを学習中。

【Ruby】メソッドの引数の種類について

はじめに

Rubyのメソッドの引数の種類について、学んだことをまとめたいと思います。ruby2.5

今回取り上げる引数


デフォルト引数

を使って、引数にデフォルト値を設定できます。
引数なしでメソッドが呼び出された場合、デフォルト引数が渡されます。

def hoge(arg='hoge')
  p arg
end
hoge         #=> "hoge"
hoge("bar")  #=> "bar"


キーワード引数

ハッシュ形式で引数を設定できます。 メソッド呼び出し時はシンボル: 値の形式で引数を指定します。 引数の役割が明確になり、複数の引数を使うときに便利です。

def hoge(msg: 'hello', name: 'Sato')
  p "#{ msg }, #{ name }"
end
hoge(msg: 'hi', name: 'Yamada') #=> "hi, Yamada"

ハッシュなので順番は気にしなくて良い。

hoge(name: 'Yamada', msg: 'hi') #=> "hi, Yamada"

定義されていないキーは使えません。

hoge(age: 28) #=> ArgumentError (unknown keyword: age)

引数を省略するとデフォルトの値が返ります。

hoge                 #=> "hello, Sato"
hoge(name: 'Tanaka') #=> "hello, Tanaka"

定義時にデフォルト値を指定していなければ、引数を省略するとエラーになります。

def hoge(msg: 'hello', name: )
  p "#{ msg }, #{ name }"
end
hoge                 #=> ArgumentError (missing keyword: name)
hoge(name: 'Tanaka') #=> "hello, Tanaka"


可変長引数

*をつけて、複数個の引数を設定できます。引数は配列で受け取られます

def hoge(*arg)
  p arg
end
hoge                #=> []
hoge('a')           #=> ["a"]
hoge('a', 'b', 'c') #=> ["a", "b", "c"]


オプション引数

**をつけて、複数個の引数を設定できます。引数はハッシュで受け取られます。

def hoge(**arg)
  p arg
end
hoge                               #=> {}
hoge(a: 'foo')                 #=> {:a=>"foo"}
hoge(a: 'foo', b: 'bar', c: 'baz') #=> {:a=>"foo", :b=>"bar", :c=>"baz"}


ブロック引数

&をつけることで、ブロックを引数として受け取ることができます。 メソッド内でcallで処理を呼び出します。

def hoge(&arg)
  arg.call
end
hoge { 1 + 2 }  
#=> 3   

hoge do 
  ['foo', 'bar', 'baz'].join(',')
end
#=> "foo,bar,baz"


下記のようにyieldで書くこともできます。こちらのほうがよく使われるようです。

def hoge
  yield
end
hoge { 1 + 2 }  
#=> 3   

hoge do 
  ['foo', 'bar', 'baz'].join(',')
end
#=> "foo,bar,baz"

使い方、結果は&と同じです。

参考ページ

https://qiita.com/rtoya/items/33617078501776fdcad7

参考文献