Курс языка программирования Raku / Продвинутый уровень / Подпрограммы / Вложенные подпрограммы / Exercises / Замыкание на внешнюю переменную

Решение: Замыкание на внешнюю переменную

Вот возможное решение задачи.

Код

sub greet($name) {
    sub message {
        "Hello, $name!";
    }

    say message;
}

greet('Anna');

🦋 Исходный код можно найти в файле closure-over-outer.raku.

Вывод

Hello, Anna!

Комментарии

  1. message не принимает аргументов, но может использовать $name. Вложенная подпрограмма замыкается на лексических переменных содержащей её подпрограммы, поэтому внешняя $name находится в области видимости.

  2. Когда выполняется greet('Anna'), значение $name равно 'Anna', поэтому message возвращает Hello, Anna!. Именно это разделение объемлющей области видимости делает вложенные помощники чем-то большим, чем просто скрытые функции.

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

Замыкание на внешнюю переменную   |   Внутренняя сумма