メソッドの引数にアスタリスク
railsのTRAILBLAZERで実装されたAPIを写経してたところ、メソッドの引数のアスタリスク2つ**のみの表記の意味がずっとわからなかったのですが、やっと解決。
def hoge(options, model:, **)
end
可変長引数とオプション引数
そもそもの引数の話として、アスタリスクがついた引数を、アスタリスク1つなら可変長引数、アスタリスク2つならオプション引数という。
ここからわかってなかった。
Rubyの引数いろいろ - Qiita
メソッドの引数にアスタリスクをつけると形式を指定できる - paranitips
可変長引数
*をつければ引数を、配列に指定できる。
メソッドには一つの引数の定義で、複数の引数を設定でき、配列として結果を返す。
これを可変長引数という。
例えば、
#複数の引数を配列にする
def array(*a)
pp a
end
実行すると
> array(1,2)
=> [1, 2]
> array(1, 2, 3)
=> [1, 2, 3]
メソッドの定義は一つの引数でも、実行時、複数の引数を設定して配列として結果を返している。
オプション引数
**をつければ引数を、ハッシュに指定できる。
メソッドには一つの引数の定義で、複数の引数を設定でき、ハッシュとして結果を返す。
これをオプション引数という。
例えば、
#複数の引数をハッシュにする
def array(**a)
pp a
end
実行すると
> array(b: 1, c: 2)
=> {:b=>1, :c=>2}
> array(b: 1, c: 2, d: 3)
=> {:b=>1, :c=>2, :d=>3}
メソッドの定義は一つの引数でも、実行時、複数の引数を設定してハッシュとして結果を返している。
【本題】 アスタリスクのみ引数に指定
アスタリスクを引数の前につけると、配列とハッシュ展開が簡単にできるとわかった。
じゃあ本題のアスタリスクのみ引数に指定された下記の書き方の意味は??
def hoge(options, model:, **)
end
調べた結果、
可変長引数 - Ruby メソッドの引数まとめ - Qiita
*と記述することで受け取った引数を無視するようにも使用できます。
例えば、
def array(a, *)
p "#{a} Hello!!!"
end
実行すると
> arry('Hi!', 'Hey!', 'Yeah!')
=> "Hi! Hello!!!"
結果、options
というハッシュのキーであるmodel:
の値を引数とし、アスタリスク2つを記載することでで、メソッド内で使わない値(過剰引数)を無視してるよう。
def hoge(options, model:, **)
end