Я не совсем уверен, что именно вы спрашиваете, но я попытаюсь объяснить, как работают замыкания.
Когда вы делаете это в Lua:
function() <some Lua code> end
Вы создаете значение . Значения - это такие вещи, как число 1, строка «строка» и т. Д.
Значения неизменны. Например, число 1 всегда является числом 1. Оно никогда не может быть числом два. Вы можете добавить 1 к 2, но это даст вам новое число 3. То же самое касается строк. Строка "string" является строкой и всегда будет этой конкретной строкой. Вы можете использовать функции Lua, чтобы убрать все символы «g» в строке, но это создаст новую строку «strin».
Функции являются значениями , так же как число 1 и строка "строка". Значения могут храниться в переменных. Вы можете хранить число 1 в нескольких переменных. Вы можете хранить строку «string» в нескольких переменных. И то же самое относится ко всем другим видам значений, включая функции.
Функции являются значениями, и поэтому они являются неизменяемыми. Однако функции могут содержать значений; эти значения не неизменны. Это очень похоже на таблицы.
Синтаксис {}
создает таблицу Lua, которая является значением. Эта таблица отличается от любой другой таблицы, даже от других пустых таблиц. Тем не менее, вы можете положить разные вещи в таблицах. Это не меняет уникальное значение таблицы, но оно меняет то, что хранится в этой таблице. Каждый раз, когда вы выполняете {}
, вы получаете новую уникальную таблицу. Так что если у вас есть следующая функция:
function CreateTable()
return {}
end
Будет верно следующее:
tableA = CreateTable()
tableB = CreateTable()
if(tableA == tableB) then
print("You will never see this")
else
print("Always printed")
end
Хотя tableA
и tableB
являются пустыми таблицами (содержат одно и то же), они являются различными таблицами. Они могут содержать одно и то же, но имеют разные значения.
То же самое относится и к функциям. Функции в Lua часто называют «замыканиями», особенно если функция имеет содержимое. Функции получают содержимое в зависимости от того, как они используют переменные. Если функция ссылается на локальную переменную, которая находится в области действия в том месте, где эта функция создается (помните: синтаксис function() end
создает функцию каждый раз, когда вы вызываете ее ), тогда функция будет содержать ссылку к этой локальной переменной.
Но локальные переменные выходят из области видимости, в то время как значение функции может жить (в вашем случае вы его возвращаете). Следовательно, объект функции, замыкание, должен содержать ссылку на эту локальную переменную, которая заставит его продолжать существовать, пока само замыкание не будет отброшено.
Где хранятся значения? Это не имеет значения; только закрытие может получить к ним доступ (хотя есть путь через C Lua API или через Lua Debug API). Таким образом, в отличие от таблиц, где вы можете получить что угодно, замыкания могут действительно скрывать данные.