Menu
Coddy logo textTech

Что такое замыкание?

Часть раздела Логика и управление потоком путешествия по 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(). Внутренняя функция сохраняет вместе с собой своё окружение, поддерживая состояние между вызовами.

challenge icon

Задание

Легко

Напишите 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Lua