はじめに
Ruby には Splat Operator
と Double Splat Operator
の2つの文法があることを知りました。以前より何回か見たことはあったが、ちゃんと理解できていなあった点もあるので、改めてその違いと特徴をまとめてみます。
前提
- Ruby 2.7.5
Splat Operator
どんなもの?
メソッドの仮引数にある *
を使用して定義した引数のことです。
def method(*args)
...
end
要は可変長引数で配列として受けることができます。
def method(*args)
args
end
p method('Ruby', name: 'yamada') # => ["Ruby", {:name=>"yamada"}]
配列として受けることができるので、引数には文字列やキーワード引数などが渡すことができます。
Double Splat Operator
どんなもの?
メソッドの仮引数にある **
を使用して定義した引数のことです。
def method(**args)
...
end
可変長キーワード引数を受け取ることができます。
def method(**args)
args
end
p method(language: 'Ruby', name: 'yamada') # => {:language=>"Ruby", :name=>"yamada"}
渡し方がキーワード引数となるので、Splat Operatorの時のように ArgumentError
が発生してしまいます。
p method('Ruby', name: 'yamada') #=>
method': wrong number of arguments (given 1, expected 0) (ArgumentError)`
まとめ
名前も似ているし、可変長という点では挙動も似ているのですが、引数の渡し方は異なるので実装時は注意が必要でした。改めて理解ができた点はよかったです。