Курс языка программирования Raku / Продвинутый уровень / Подпрограммы
Анонимные подпрограммы
Подпрограмма не обязана иметь имя. Анонимная подпрограмма записывается так же, как и обычная, но без имени, и обычно сохраняется в переменной, чтобы её можно было вызвать позже.
my $double = sub ($x) {
$x * 2
};
say $double(5); # 10Переменная $double хранит подпрограмму, а
$double(5) вызывает её с аргументом 5.
Остроконечные блоки
Raku предлагает более короткую запись для того же самого —
остроконечный блок (pointy block). Он использует стрелку
-> для объявления параметров и не требует ни слова
sub, ни скобок вокруг них:
my $double = -> $x {
$x * 2
};
say $double(5); # 10Это самый распространённый способ записи небольшой анонимной подпрограммы.
Сигил &
Если вы предпочитаете вызывать подпрограмму по имени, а не через
переменную с $, объявите переменную с сигилом
&. Тогда её можно вызывать без сигила, точно так же,
как обычную подпрограмму:
my &triple = -> $x {
$x * 3
};
say triple(4); # 12Передача в другую функцию
Анонимную подпрограмму вовсе не обязательно сохранять в переменной.
Поскольку это просто значение, его можно передать напрямую в функцию,
которая его ожидает, — например, в map, grep
или sort:
say (1, 2, 3).map(-> $x { $x * 2 }); # (2 4 6)Остроконечный блок здесь является анонимной подпрограммой, и
map вызывает его для каждого элемента. На самом деле именно
это вы делали всё это время: каждый блок { ... } и
-> $x { ... }, который вы передавали в map
и grep, — это небольшая анонимная подпрограмма, написанная
прямо там, где она нужна, вместо того чтобы сначала давать ей имя.
Практика
Пройдите 1 тест по содержанию этой темы.
Упражнения
В этом разделе 3 упражнения. Прежде чем приступать к практике, изучите все темы раздела.