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

  1. Whatever з map
  2. Whatever з двома аргументами
  3. Відкритий діапазон

Навігація курсом

Тест — Slurpy-параметри   |   Whatever з map