У меня вопрос о том, как закрываются блокировки.
Скажите, что это файл с именем 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
также меняет указатель внутри замыкания?
Википедия довольно хорошо говорит о том, что озадачивает меня:
Реализация языка не может легко поддерживать полное закрытие, если его модель памяти во время выполнения распределяет все локальные переменные в линейном стеке 1. В таких языках функция локальных переменных освобождается при возврате функции.
Я думал, что, возможно, b
действительно не сохранил указатель на 'asdf'
, а смещение стека на a
, так что вы можете изменить a
, и смещение стека приведет вас к a
который указывает на последнее, что вы установили a
, но как это работает, когда a
(указатель) выскользнул из стека, и смещение стека становится недействительным?
1 Я знаю, что Lua не выделяет значения в стеке, но он выделяет локальные указатели в стеке значениям в куче, не так ли?