Курс языка программирования Raku / Продвинутый уровень / Подпрограммы / Вложенные подпрограммы / Exercises / Замыкание на внешнюю переменную
Решение: Замыкание на внешнюю переменную
Вот возможное решение задачи.
Код
sub greet($name) {
sub message {
"Hello, $name!";
}
say message;
}
greet('Anna');🦋 Исходный код можно найти в файле closure-over-outer.raku.
Вывод
Hello, Anna!Комментарии
messageне принимает аргументов, но может использовать$name. Вложенная подпрограмма замыкается на лексических переменных содержащей её подпрограммы, поэтому внешняя$nameнаходится в области видимости.Когда выполняется
greet('Anna'), значение$nameравно'Anna', поэтомуmessageвозвращаетHello, Anna!. Именно это разделение объемлющей области видимости делает вложенные помощники чем-то большим, чем просто скрытые функции.