【Ruby】引数の* アスタリスクって、 Nan - Nan ?

たまに見かける* や *hoge、** の意味について調べました。

 

めっちゃ簡単に纏めると

 

def (a, *b)

複数の引数をまとめて配列として受け取ることができます。

 

def (a , *)

受け取った引数を無視する

 

def (a, ** )

複数の引数をhashにする。

 

 

可変長引数のケース

メソッドの引数におけるアスタリスクは、可変長引数と呼ばれています。
可変長引数を使うと、好きな数の引数をメソッドに渡すことができるようになります。
可変長引数で関数に渡された値は、配列として関数側で受け取ることができます。

 

例)

 
def render_l_format_body(file_data)
max_sizes = %i[user group size].map do |key|
find_max_size(row_data, key)
end
row_data.map do |data|
format_data(data, *max_sizes) # ここ
end
end
 
def format_data(data, max_user, max_group, max_size)
[
data[:type_and_mode],
" #{data[:user].ljust(max_user)}",
" #{data[:group].ljust(max_group)}",
" #{data[:size].rjust(max_size)}",
].join
end

 

def format_row(data, max_user, max_group, max_size)

このメソッドに必要な引数は4つ。

ですが、

format_row(data, *max_sizes)

実際の使用時は、上記の様に記述されています。

これは、説明どおり

可変長引数で関数に渡された値は、配列として関数側で受け取ることができます。

 

max_sizes = %i[user group size].map do |key|

なので、

max_sizesに代入した値が配列展開されて、
%iで定義されていた分が必要な引数として渡されています。

オプション引数のケース

**をつければ引数を、ハッシュに指定できる。
メソッドには一つの引数の定義(**a)にて複数の引数を設定でき、ハッシュとして結果を返す。
これをオプション引数という。

 

例)

irb(main):001:1* def array(**a)

irb(main):002:1*   pp a

irb(main):003:0> end

=> :array

irb(main):004:0> array(b: 1, c:2)

{:b=>1, :c=>2}

=> {:b=>1, :c=>2}

 

複数の引数を設定できます。

 

 

*のみを引数に指定した場合

可変長引数になります。
メソッドの仮引数の前に* を付けると、複数の引数をまとめて配列として受け取ることができます。
※ただしこの可変長引数は1メソッドにつき、1つだけしか指定するができません。

 

★過剰引数を無視してくれる。(エラーにならない)

 

qiita.com

 

るりまより

メソッド名には通常の識別子の他、識別子に ? または ! の続いたものが許されます。慣習として、述語(真偽値を返すメソッド)には ? を、同名の(! の無い)メソッドに比べてより破壊的な作用をもつメソッド(例: 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)

と同じです。

 

docs.ruby-lang.org

 

ちなみに

代入演算子だと

a **= b       # a = a ** b に同じ

 

参考:

qiita.com

 

programming-dojo.com

 

tm.root-n.com