Von einem C-Modul aus ist das einfache Ding zu tun, eine vollständige userdata
mit einer metatable
und einem __gc
Metamethod zu erstellen. Speichern Sie es in einem Feld in der Umgebung des Moduls, damit es nicht vom GC gesammelt wird, bis das Modul entladen wird.
Laut dem Handbuch werden nur userdata
durch den Sammler angerufen, um ihren __gc
Metamethod aufzurufen, sodass Sie keine Tabelle verwenden können, um den Finalisierer des Moduls zu halten.
Für ein in reinem Lua geschriebenes Modul, das einen Finalisierer benötigt, müssen Sie immer noch eine userdata
haben, um ihn aufrechtzuerhalten. Die nicht unterstützte und undokumentierte, aber weithin bekannte Funktion newproxy()
kann verwendet werden, um ansonsten eine leere userdata
mit einer Metatable zu erstellen, die für diesen Zweck verwendet wird. Rufen Sie sie als newproxy(true)
auf, um eine mit einer Metatable zu erhalten, und verwenden Sie getmetatable()
, um die Metatable abzurufen, damit Sie den __gc
Metamethod hinzufügen können.