二重*(スプラット)演算子の機能


214

このように宣言された関数を見ましたか?

def foo a, **b
  ...
end

シングル*がスプラット演算子であることを理解しています。どういう**意味ですか?

回答:


373

Ruby 2.0はキーワード引数を導入し、の**よう*に動作しますが、キーワード引数に対してです。キーと値のペアを持つハッシュを返します。

このコードの場合:

def foo(a, *b, **c)
  [a, b, c]
end

ここにデモがあります:

> foo 10
=> [10, [], {}]
> foo 10, 20, 30
=> [10, [20, 30], {}]
> foo 10, 20, 30, d: 40, e: 50
=> [10, [20, 30], {:d=>40, :e=>50}]
> foo 10, d: 40, e: 50
=> [10, [], {:d=>40, :e=>50}]

44
これは質問に完全に答えますが、ちょっとした補遺がありました。渡す配列でsplat演算子を使用できるのと同じように、ハッシュでは二重のsplatを使用できます。の場合opts = {d: 40, e: 50}、はfoo 10, opts, f: 60に割り当て{f: 60}られますcが、foo 10, **opts, f: 60は割り当てられ{d: 40, e: 50, f: 60}ます。2番目の効果を実現するには、以前はmerge明示的に配列を指定していました。
brymck 2013年

これは、メソッドのオプションのハッシュパラメータを設定するのに役立つと思います
bigpotato

キーワード引数とキーワードスプラットを混在させる場合、キーワードスプラットをキーワード引数の後に置く必要があることに注意してください。
MrMesees

43

これは、Ruby 2.0以降で使用可能な二重スプラット演算子です。

すべてのキーワード引数をキャプチャします(これは単純なハッシュにすることもできます。これは、Ruby言語の一部になる前にキーワード引数をエミュレートする慣用的な方法でした)。

def my_method(**options)
  puts options.inspect
end

my_method(key: "value")

上記のコード{key:value}はコンソールに出力されます。

単一のsplatオペレーターがすべての通常の引数をキャプチャするのと同じように、配列の代わりにハッシュを取得します

実際の例:

たとえばRailsでは、cycleメソッドは次のようになります。

def cycle(first_value, *values)
  options = values.extract_options!
  # ...
end

このメソッドは次のように呼び出すことができますcycle("red", "green", "blue", name: "colors")

これは非常に一般的なパターンです。引数のリストを受け入れ、最後の引数はオプションハッシュextract_options!です。たとえば、ActiveSupportを使用して抽出できます。

Ruby 2.0では、これらのメソッドを簡略化できます。

def cycle(first_value, *values, **options)
  # Same code as above without further changes!
end

確かに、すでにActiveSupportを使用している場合はわずかな改善ですが、単純なRubyの場合、コードはかなり簡潔になります。


20

さらに、次のように呼び出し側で使用できます。

def foo(opts); p opts end
bar = {a:1, b:2}

foo(bar, c: 3)
=> ArgumentError: wrong number of arguments (given 2, expected 1)

foo(**bar, c: 3)
=> {:a=>1, :b=>2, :c=>3}

5
うわー、ダブルスプラットはES6のオブジェクトスプレッドオペレーターに似ています。
mpoisot

1
ありがとう、それは私が探していた確認です。
Qortex
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.