Hier ist mein Testcode:Wie lua gc explizit nennen?
mt={}
myt={}
setmetatable(myt, mt)
mt.__gc=function()print("hello gc")end
myt=nil
collectgarbage()
Aber, wenn ich diesen Code ausgeführt wird, gibt es keine Meldung drucken.
Also, ich denke, da muss etwas in meinem Code falsch sein.
Update:
mt.__gc=function()print("hello gc")end
setmetatable(myt, mt)
Set __gc
Feld vor setmetatable
die Frage lösen würde (mit dem Online-interpreter), aber, wenn ich den gleichen Code durch C API luaL_dofile
in meinem Programm ausführen, __gc
ist wieder tot.
Und ich teste auch in meinem standalone lua interprete (lua 5.1.5), und "__gcc" ist auch tot.
Der einzige funktionierende Fall ist, dass online interpreter welche Version ist 5.3.
Also, ich sollte wahrscheinlich fragen, wie kann ich '__gc' unter meiner Version 5.1 arbeiten?
'__gc' metamethod sollte in metatable sein, wenn Sie' setmetatable' aufrufen. Und natürlich funktioniert es nur seit Lua 5.2 – moteus
'setmetatable ({}, {__gc = function() drucken (" Hallo gc ") Ende)) collectgarbage()' Getestet auf Lua 5.2 – moteus
Vielen Dank @ moteus.BUT WARUM? Weil, wenn ich andere Elemente der Metatabelle nach dem Aufruf von 'setmetatable' setze, funktionieren alle gut, wie zum Beispiel __index, einige Funktionen, Variablen ... Warum "GC" so besonders? Gibt es ein offizielles Dokument, das darüber erzählt? – francis