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