¿Has visto una función declarada así?
def foo a, **b
...
end
Entiendo que un solo *
es el operador splat. Que hace**
significa
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}]
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.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)
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í: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:
Es cierto que solo es una mejora menor si ya está utilizando ActiveSupport, pero para Ruby, el código gana bastante concisión.
fuente
Además, puede usarlo en el lado de la persona que llama de esta manera:
fuente