【Ruby】引数の* アスタリスクって、 Nan - Nan ?
たまに見かける* や *hoge、** の意味について調べました。
めっちゃ簡単に纏めると
def (a, *b)
複数の引数をまとめて配列として受け取ることができます。
def (a , *)
受け取った引数を無視する
def (a, ** )
複数の引数をhashにする。
可変長引数のケース
メソッドの引数におけるアスタリスクは、可変長引数と呼ばれています。
可変長引数を使うと、好きな数の引数をメソッドに渡すことができるようになります。
可変長引数で関数に渡された値は、配列として関数側で受け取ることができます。
例)
このメソッドに必要な引数は4つ。
ですが、
実際の使用時は、上記の様に記述されています。
これは、説明どおり
可変長引数で関数に渡された値は、配列として関数側で受け取ることができます。
なので、
オプション引数のケース
**をつければ引数を、ハッシュに指定できる。
メソッドには一つの引数の定義(**a)にて複数の引数を設定でき、ハッシュとして結果を返す。
これをオプション引数という。
例)
複数の引数を設定できます。
*のみを引数に指定した場合
★過剰引数を無視してくれる。(エラーにならない)
るりまより
メソッド名には通常の識別子の他、識別子に ? または ! の続いたものが許されます。慣習として、述語(真偽値を返すメソッド)には ? を、同名の(! の無い)メソッドに比べてより破壊的な作用をもつメソッド(例: tr と tr!)には ! をつけるようになっています。
引数の直前に * がついている場合、その引数の値が展開されて渡されます。展開はメソッド to_a を経由して行なわれます。つまり:
foo(1,*[2,3,4]) foo(1,*[]) foo(1,*[2,3,4],5) foo(1,*[2,3,4],5,*[6])
は、それぞれ
foo(1,2,3,4) foo(1) foo(1,2,3,4,5) foo(1,2,3,4,5,6)
と同じです。
ちなみに
代入演算子だと
a **= b # a = a ** b に同じ
参考: