Что такое замыкание?
Часть раздела Логика и управление потоком путешествия по Lua на Coddy. Урок 14 из 54.
Вы узнали, что функции можно сохранять в переменных, передавать в качестве аргументов и возвращать из других функций. Теперь мы рассмотрим одно из самых мощных следствий этого: замыкания.
Замыкание возникает, когда вложенная function «запоминает» переменные local из охватывающей её function, даже после того, как эта внешняя function завершила выполнение. Сначала это может показаться странным: как переменная может всё ещё существовать после завершения function, которая её создала?
Вот простой пример, демонстрирующий эту концепцию:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Вывод: 1
print(counter()) -- Вывод: 2
print(counter()) -- Вывод: 3Когда вызывается createCounter(), он создаёт локальную переменную count и возвращает анонимную function. Обычно можно ожидать, что count исчезнет после завершения createCounter(). Но возвращённая function по-прежнему имеет доступ к count. Она «замыкается» на этой переменной.
Каждый раз, когда вы вызываете counter(), функция обращается к одной и той же переменной count и изменяет её — той, которая была создана при первом запуске createCounter(). Внутренняя функция сохраняет вместе с собой своё окружение, поддерживая состояние между вызовами.
Задание
ЛегкоНапишите function createMultiplier, которая создаёт function-множитель с определённым factor, а затем сразу использует её для умножения заданного number.
Логика:
- Создайте вложенную function внутри
createMultiplier, которая принимает параметр number - Вложенная function должна умножать свой параметр на
factorиз внешней function - Вложенная function образует замыкание, запоминая значение
factor - Вызовите function-множитель с параметром
numberи верните результат
Параметры:
factor(number): значение множителяnumber(number): number, который нужно умножить
Возвращает:
- Результат умножения
numberнаfactor(number)
Попробуйте сами
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- Используйте функцию multiply ниже
endВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов3Продвинутые концепции функций
Возврат нескольких значенийВариативные функции (...)Функции как объекты первого классаАнонимные функцииЧто такое замыкание?Итоги — простой обработчик событийПотренируйтесь самостоятельно: Онлайн-компилятор Lua