Курс языка программирования 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 упражнения. Прежде чем приступать к практике, изучите все темы раздела.

  1. map через двоеточие
  2. join через двоеточие
  3. sort через двоеточие

Навигация по курсу

Тест — Звёздочка Whatever   |   map через двоеточие