Respuestas:
Ruby 2.0 introdujo argumentos de palabras clave y **
actúa como *
, pero para argumentos de palabras clave. Devuelve un hash con pares clave / valor.
Para este código:
def foo(a, *b, **c)
[a, b, c]
end
Aquí hay una demostración:
> 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}]
Ese es el doble splat operador de que está disponible desde Ruby 2.0.
Captura todos los argumentos de palabras clave (que también puede ser un simple hash, que era la forma idiomática de emular argumentos de palabras clave antes de que se convirtieran en parte del lenguaje Ruby)
def my_method(**options)
puts options.inspect
end
my_method(key: "value")
El código anterior se imprime {key:value}
en la consola.
Al igual que el operador splat único captura todos los argumentos regulares, pero en lugar de una matriz , obtiene un hash .
Ejemplo de la vida real:
Por ejemplo, en Rails, el cycle
método se ve así:
def cycle(first_value, *values)
options = values.extract_options!
# ...
end
Este método se puede llamar así: cycle("red", "green", "blue", name: "colors")
.
Este es un patrón bastante común: acepta una lista de argumentos y el último es un hash de opciones, que puede extraerse, por ejemplo, utilizando ActiveSupport extract_options!
.
En Ruby 2.0 puede simplificar estos métodos:
def cycle(first_value, *values, **options)
# Same code as above without further changes!
end
Es cierto que solo es una mejora menor si ya está utilizando ActiveSupport, pero para Ruby, el código gana bastante concisión.
Además, puede usarlo en el lado de la persona que llama de esta manera:
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}
opts = {d: 40, e: 50}
, entoncesfoo 10, opts, f: 60
asignará{f: 60}
ac
, mientrasfoo 10, **opts, f: 60
que asignará{d: 40, e: 50, f: 60}
. Para lograr el segundo efecto, previamente habría tenidomerge
d las matrices explícitamente.