回答:
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}]
これは、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の場合、コードはかなり簡潔になります。
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
明示的に配列を指定していました。