Вы видели функцию, объявленную так?
def foo a, **b
...
end
Я понимаю, что одиночный *
оператор сплат. Что **
значит?
В 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}]
opts = {d: 40, e: 50}
, тоfoo 10, opts, f: 60
назначит{f: 60}
кc
, в то время какfoo 10, **opts, f: 60
будет назначать{d: 40, e: 50, f: 60}
. Для достижения второго эффекта ранее вы должны были быmerge
явно использовать массивы.Это оператор двойных сплатов , доступный с Ruby 2.0.
Он захватывает все аргументы ключевого слова (который также может быть простым хешем, который был идиоматическим способом эмулировать аргументы ключевого слова до того, как они стали частью языка Ruby)
Приведенный выше код выводится
{key:value}
на консоль.Точно так же, как оператор одиночного сплата захватывает все обычные аргументы, но вместо массива вы получаете хеш .
Пример из жизни:
Например, в Rails
cycle
метод выглядит так:Этот метод можно назвать так:
cycle("red", "green", "blue", name: "colors")
.Это довольно распространенный шаблон: вы принимаете список аргументов, а последний - хэш опций, который можно извлечь, например, используя ActiveSupport
extract_options!
.В Ruby 2.0 вы можете упростить эти методы:
По общему признанию, это лишь незначительное улучшение, если вы уже используете ActiveSupport, но для простого Ruby код получает довольно много краткости.
источник
Кроме того, вы можете использовать его на стороне вызывающего абонента следующим образом:
источник