2016-12-13 5 views
1

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?

+1

'__gc' metamethod sollte in metatable sein, wenn Sie' setmetatable' aufrufen. Und natürlich funktioniert es nur seit Lua 5.2 – moteus

+0

'setmetatable ({}, {__gc = function() drucken (" Hallo gc ") Ende)) collectgarbage()' Getestet auf Lua 5.2 – moteus

+0

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

Antwort

1

Sie müssen das __gc Feld vor unter Aufruf setmetatable festlegen.

Die manual sagt:

Beachten Sie, dass, wenn Sie einen Metatabelle ohne __gc Feld gesetzt und später das Feld in der Metatabelle erstellen, wird das Objekt nicht für den Abschluss markiert werden.

GC-Methoden für Tabellen wurden in Lua 5.2 eingeführt. Sie arbeiten nicht in Lua 5.1.

+0

Ja, das habe ich jetzt bemerkt. Aber wie ich im letzten Kommentar oben gesagt habe, wenn ich lua Skript über C API luaL_dofile ausführe, wird der GC nicht mit demselben Code oben aufgerufen. @ Lhf – francis

+0

@francis, hast du den Return Code von 'luaL_dofile' überprüft? Wenn ja, poste deinen C-Code. – lhf

+0

Ja, ich habe.'LuaL_dofile 'nur zurückgeben 0.Kein Fehler aufgetreten.Ah, ich habe gesehen, Sie bearbeitet Ihre Antwort.Und dann verglich ich das 5.1 Dokument mit 5.2.Sie haben Recht, GC metamethod kann nur für userdata verwendet werden 5.1. @ Vielen Dank. @ Lhf – francis