Czy widziałeś taką funkcję zadeklarowaną?
def foo a, **b
...
end
Rozumiem, że jeden *
jest operatorem splat. Co **
znaczy
Ruby 2.0 wprowadził argumenty słów kluczowych i **
działa jak *
, ale dla argumentów słów kluczowych. Zwraca skrót z parami klucz / wartość.
Dla tego kodu:
def foo(a, *b, **c)
[a, b, c]
end
Oto demo:
> 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}]
opts = {d: 40, e: 50}
, tofoo 10, opts, f: 60
przypisze{f: 60}
doc
, afoo 10, **opts, f: 60
przypisze{d: 40, e: 50, f: 60}
. Aby osiągnąć drugi efekt, wcześniejmerge
tablice byłyby jawnie jawne.To jest operator podwójnej ikony , który jest dostępny od Ruby 2.0.
Przechwytuje wszystkie argumenty słów kluczowych (które mogą być również prostymi skrótami, co było idiomatycznym sposobem emulacji argumentów słów kluczowych, zanim stały się częścią języka Ruby)
Powyższy kod jest drukowany
{key:value}
na konsoli.Podobnie jak operator pojedynczej ikony przechwytuje wszystkie zwykłe argumenty, ale zamiast tablicy otrzymujesz skrót .
Przykład z życia:
Na przykład w Railsach
cycle
metoda wygląda następująco:Metoda ta może być wywołana tak:
cycle("red", "green", "blue", name: "colors")
.Jest to dość powszechny wzorzec: akceptujesz listę argumentów, a ostatni to skrót opcji, który można wyodrębnić - na przykład - za pomocą ActiveSupport
extract_options!
.W Ruby 2.0 możesz uprościć te metody:
Wprawdzie jest to tylko niewielka poprawa, jeśli już używasz ActiveSupport, ale dla zwykłego Ruby kod zyskuje dość zwięzłość.
źródło
Ponadto można go używać po stronie dzwoniącego w następujący sposób:
źródło