Курс по 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 упражнения. Разгледайте всички теми в раздела, преди да се захванете с практиката.