У меня есть вопрос о том, как реализованы закрытия.
Предположим, это находится в файле с именем test.lua
:
local a = 'asdf'
local function b()
return a
end
a = 10
return b
А другой файл -
a = require 'test'
a()
, он напечатает
10
Если a
является указателем на стек на 'asdf'
(я предполагаю, что в куче, но это не имеет значения), а закрытие b
создается так, предположительно, адрес, который был в a
сохраняется для использования b
, как a = 10
также изменяет указатель внутри замыкания?
Википедия очень хорошо говорит, что меня смущает:
A реализация языка не может легко поддерживать полное замыкание, если его модель памяти времени выполнения выделяет все локальные переменные в линейном стеке 1 . В таких языках локальные переменные функции освобождаются, когда функция возвращается.
Я подумал, что, возможно, b
действительно не сохранил указатель на 'asdf'
, а смещение стека на a
, так что вы можете изменить a
и смещение стека приведет вас к a
, который указывает на последнее значение, которое вы установили для a
, но тогда как это работает, когда a
(указатель) выскакивает из стека, и смещение стека становится недействительным?
1 Я знаю, что Lua не выделяет значений в стеке, но выделяет локальные указатели в стеке к значениям в куче, не так ли?