Совместное использование глобальных переменных lua в файлах сценариев?

Скажем, у меня есть скрипт вроде

my_global = my_cpp_class()
my_global = nil

теперь, хотя это правильно вызывает деструктор my_cpp_class, этот код не делает:

my_global = my_cpp_class()
call_script("a.lua") -- a.lua contains "my_global = nil"
-- "call_script" is actually a simplified notation 
-- I create script as userdata and then I can 
-- set its child scripts that should be reloaded once script is modified

То же самое, когда я просто заменяю call_script на dofile.

По сути, я хочу, чтобы конкретный файл сценария мог присваивать «nil» существующему глобальному параметру, чтобы старое значение становилось недоступным.

Теперь мне это нужно для перезагрузки сценария в режиме реального времени - всякий раз, когда файл сценария изменяется, он мгновенно компилируется и снова вызывается с помощью call_script со своими дочерними сценариями во время выполнения, поэтому это должно вызывать переназначение глобальных переменных, и, следовательно, старые значения должны быть мусором собрал.

Есть ли более простой и предпочтительный способ перезагрузки скрипта?

Должен ли я как-то использовать местных жителей или манипулировать окружением? Я использую luabind, если это уместно.


person Patryk Czachurski    schedule 29.09.2013    source источник
comment
Рассмотрите возможность изолирования ваших скриптов в их собственном _ENV, таким образом вы можете просто дать перезагруженным скриптам новую среду вместо того, чтобы очищать старую/общую (и, возможно, что-то упустить)   -  person dualed    schedule 30.09.2013


Ответы (1)


Если вы выполняете скрипт в пределах одного и того же lua_State, глобальная переменная фактически переназначается (перед назначением nil вы можете убедиться, что переменная видна). Деструктор объекта C++ запускается при сборе объекта, что может произойти не сразу после того, как он станет недоступным. Вызов lua_gc() из C++ или collectgarbage() из Lua, вероятно, поможет.

person Oberon    schedule 29.09.2013