Курс Raku / Розширені / Підпрограми

Анонімні підпрограми

Підпрограма не обов’язково повинна мати ім’я. Анонімна підпрограма записується так само, як звичайна, але без імені, і зазвичай зберігається у змінній, щоб її можна було викликати пізніше.

my $double = sub ($x) {
    $x * 2
};

say $double(5); # 10

Змінна $double зберігає підпрограму, а $double(5) викликає її з аргументом 5.

Стрілочні блоки

Raku пропонує коротший запис для того ж самого — стрілочний блок. Він використовує стрілку -> для введення параметрів і не потребує ні слова 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. Сума з сигілом &

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

Тест — Вкладена область видимості   |   Потроїти