Курс Raku / Розширені / Підпрограми
Зірка Whatever 🆕
Можливо, ви вже бачили * у виразах на кшталт
* * 2 або * %% 2 під час виклику
map і grep. Ця * — зірочка
Whatever, і вираз навколо неї на льоту будує невеличку функцію з
одним аргументом. Цей розділ пояснює, чим вона є насправді, як
співвідноситься з блоком і де сама по собі зірочка означає просто «як
завгодно».
Зірочка створює функцію
Коли * з’являється у виразі, Raku перетворює весь вираз
на функцію — WhateverCode, — у якій зірочка позначає
аргумент:
my $double = * * 2;
say $double.^name; # WhateverCode
say $double(21); # 42* * 2 — це функція, яка множить свій єдиний аргумент на
два. Саме тому працює (1..5).map(* * 2): до
map потрапляє точно така функція з одним аргументом.
Whatever проти блоку
Вираз із Whatever — це коротший спосіб записати функцію, яку можна було б записати й блоком. Ці три записи рівносильні:
* * 2
{ $_ * 2 }
-> $x { $x * 2 }Форма з Whatever не називає параметра; форма з блоком використовує
топічну змінну $_; стрілкова форма називає його
$x. Остання, -> $x { ... }, сама по собі є
невеликою функцією — ви познайомитеся з нею як слід у розділі Анонімні підпрограми; тут
досить читати її як третій спосіб записати ту саму функцію з одним
аргументом. Для простого виразу зірочка найкомпактніша, — тому вона така
поширена з map, grep і sort:
say (1..5).map(* * 2); # (2 4 6 8 10)
say (1..5).map({ $_ * 2 }); # (2 4 6 8 10)
say (1..5).map(-> $x { $x * 2 }); # (2 4 6 8 10)Беріть блок, коли логіка потребує більш ніж одного виразу або коли зрозуміліший іменований параметр стає в пригоді. Беріть зірочку, коли короткий вираз каже все.
Більше ніж одна зірочка
Кожна * у виразі — це окремий аргумент, по порядку. Тож
дві зірочки створюють функцію з двома аргументами:
my $add = * + *;
say $add(3, 4); # 7Тут * + * — це функція двох аргументів, яка їх додає:
наприклад, накопичену суму й наступний елемент.
Гола Whatever
Сама по собі * означає «як завгодно» — скільки є або без
обмежень. Два повсякденні застосування:
my @a = 10, 20, 30;
say @a[*-1]; # 30 — * це довжина масиву, тож *-1 це останній індекс
say (1..*).head(3); # (1 2 3) — 1..* це відкритий діапазонУ @a[*-1] зірочка позначає кількість елементів, а в
1..* — «без верхньої межі». Чи будує вона функцію, чи
означає «як завгодно», зірочка є одним із найкорисніших скорочень
Raku.
Практика
Виконайте 1 тест за змістом цієї теми.
Вправи
У цьому розділі 3 вправи. Перш ніж братися до практики, вивчіть усі теми розділу.