Курс по 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 формата не назовава параметър; блоковата форма използва тематичната променлива $_; pointy формата назовава $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