Введение в операторы 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}
Спасибо, что прочитали, а теперь попробуйте поиграть с ним сами!