LoginSignup
48

More than 1 year has passed since last update.

メソッドの引数にアスタリスク

Last updated at Posted at 2018-12-11

メソッドの引数にアスタリスク

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

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
48