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

  1. Утроить
  2. Анонимный квадрат
  3. Сумма с сигилом &

Навигация по курсу

Тест — Вложенная область видимости   |   Утроить