Курс языка программирования Raku / Продвинутый уровень / Подпрограммы
Вызов через двоеточие
Когда вы вызываете метод или подпрограмму, вы обычно указываете
аргументы в скобках: @a.grep(* > 5). Raku предлагает
вторую форму — поставьте двоеточие после имени, и всё,
что следует за двоеточием, становится списком аргументов, без каких-либо
скобок:
say (1..10).grep: * %% 2; # (2 4 6 8 10)Двоеточие в grep: выполняет ту же роль, что и скобки:
(1..10).grep: * %% 2 означает то же самое, что и
(1..10).grep(* %% 2). Обе формы взаимозаменяемы:
say <a b c>.join('-'); # a-b-c
say <a b c>.join: '-'; # a-b-cФорма с двоеточием особенно удобна при вызове методов, принимающих блок или выражение Whatever, поскольку она убирает один уровень вложенности. Сравните:
my @a = 3, 1, 2;
say @a.sort({ $^b <=> $^a }); # скобки вокруг блока
say @a.sort: { $^b <=> $^a }; # двоеточие -- нет закрывающей скобкиОба варианта выводят (3 2 1), но версия с двоеточием
читается чище, особенно когда блок длинный.
Это аналог вызова без скобок, который вы уже используете со
списковыми операторами вроде say 1, 2, 3 — там
say принимает всё, что следует за ним, в качестве
аргументов. Единственное правило, которое нужно запомнить: форма с
двоеточием поглощает остаток выражения как аргументы,
поэтому она должна стоять в конце цепочки вызовов.
Именно поэтому
('a' .. 'z')».uc».ord.grep: 60 < * < 70 работает:
grep — последний вызов в цепочке, и после него нечего
вызывать. Если вам нужно продолжить цепочку методов, используйте форму
со скобками или сгруппируйте части выражения, чтобы сделать его
понятным:
say (('a' .. 'z')».uc».ord.grep: 60 < * < 70)».chr # (A B C D E)Обратите внимание: не совмещайте двоеточие и скобки
в виде .grep:( … ). Такая запись конфликтует с синтаксисом
литерала сигнатуры :( … ) и не будет разобрана. Используйте
либо .grep( … ), либо .grep: … — что-то одно,
но не оба варианта сразу.
Практика
Пройдите 1 тест по содержанию этой темы.
Упражнения
В этом разделе 3 упражнения. Прежде чем приступать к практике, изучите все темы раздела.