Раздавать lua globals через файлы сценариев?

Скажем, у меня есть сценарий, как

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.

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

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

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

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

1 ответ

Решение

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

Другие вопросы по тегам