Курс 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 через двокрапку