Вот мой тестовый код:Как явным образом назвать lua gc?
mt={}
myt={}
setmetatable(myt, mt)
mt.__gc=function()print("hello gc")end
myt=nil
collectgarbage()
Но, когда я работает этот код, нет никаких сообщений печати.
Итак, я думаю, что в моем коде должно что-то не так.
Update:
mt.__gc=function()print("hello gc")end
setmetatable(myt, mt)
Установить __gc
поле перед setmetatable
бы решить вопрос (с помощью онлайн interpreter), но, когда выполнение того же кода через C API luaL_dofile
в моей программе, __gc
снова мертв.
И я также тестирую в своем автономном lua-интерпретаторе (lua 5.1.5), а «__gcc» тоже мертв.
Единственный рабочий штраф - interpreter, версия которого составляет 5.3.
Итак, я должен, вероятно, спросить, как я могу получить «__gc» для работы под моей версией 5.1?
'__gc' metamethod должен быть в метатете, когда вы вызываете' setmetatable'. И, конечно, это работает только с Lua 5.2 – moteus
'setmetatable ({}, {__gc = function() print (" hello gc ") end}) collectgarbage()' Протестировано на Lua 5.2 – moteus
Спасибо большое @ moteus.BUT ПОЧЕМУ? Потому что, когда я устанавливаю другие элементы metatable после того, как я называю «setmetatable», все они работают нормально, например __index, некоторые функции, переменные ... Почему «GC» настолько особенный? Есть ли какие-либо официальные документы, рассказывающие об этом? – francis