Введение в операторы Ruby * Splat и double ** Splat

Вы когда-нибудь хотели определить метод, не зная, сколько аргументов для этого потребуется? Вы проводите долгие беспокойные ночи в поисках простого способа разделить список на хэш? Что ж, смотрите не дальше, чем операторы splat в Ruby! С их помощью можно сделать так много замечательных вещей, но я просто расскажу об основах и расскажу о некоторых хитростях, которые я обнаружил.

Одноместный * Splat

Оператор splat имеет почти бесконечное применение. Но основная идея заключается в том, что всякий раз, когда вы не хотите указывать количество имеющихся аргументов, вы должны использовать оператор splat. Самый простой пример будет примерно таким:

Еще одна полезная вещь - оператор splat может разбить массив на несколько аргументов:

arr = ["first", "second", "third"]
def threeargs(*arr)
#makes three arguments

Вы также можете использовать оператор splat для захвата любого сегмента массива:

first, *rest, last  = ["a", "b", "c", "d"]
p first # "a"
p rest # ["b", "c"]
p last # "d"

Вы заметите, что остальная переменная по-прежнему является массивом, что очень удобно. Итак, следуя последнему примеру, вы все еще можете делать такие вещи:

first, *rest, last  = ["a", "b", "c", "d"]
p rest[0] # "b"

Это основы единственного оператора splat, но я призываю вас больше с ним возиться. Он может объединять массивы, превращать хэши и строки в массивы или извлекать элементы из массива!

Двухместный ** Сплат

Оператор двойного знака появился еще в Ruby 2.0. Он очень похож на оригинальный splat с одним отличием: его можно использовать для хэшей! Вот пример самого простого использования двойного знака.

def doublesplat(**nums)
  p **nums
end
doublesplat one: 1, two: 2 # {:one=>1, :two=>2}

Собираем все вместе

Надеюсь, вы видите, что возможности использования этих двух вместе безграничны. Главное помнить, что вы используете знаки splats в качестве параметра в методе, когда не уверены, сколько аргументов будет использовать этот метод.

Наконец, я создал небольшую функцию, которая показывает, как можно отфильтровать любой аргумент, не являющийся парой значений ключа, используя как одиночный, так и двойной знак.

def dubSplat(a, *b, **c)
  p c
end
dubSplat(1,2,3, 4, a: 40, b: 50)
#{:a=>40, :b=>50}

Спасибо, что прочитали, а теперь попробуйте поиграть с ним сами!