我正在为Lua写一个模块。在关闭lua解释器时,它必须运行清理例程,即使用户忘记隐式调用shutdown例程。
该模块主要用C语言编写。
我应该使用Lua C Api中的哪些回调来检测程序执行结束?我唯一的想法是在表示我的模块的表上使用__gc元方法。有什么想法吗?
答案 0 :(得分:4)
在C模块中,最简单的方法是使用带有userdata
元方法的metatable
创建一个完整的__gc
。将其存储在模块环境中的一个字段中,以便在卸载模块之前GC不会收集它。
根据the manual,只有userdata
获取收集器调用的__gc
元方法,因此您无法使用表来保存模块的终结器。
对于用纯Lua编写的需要终结器的模块,您仍然需要userdata
来保持它。不受支持且未记录但广为人知的函数newproxy()
可用于创建一个空的userdata
,其中包含用于此目的的元表。将其命名为newproxy(true)
以获取具有元表的元素,并使用getmetatable()
检索元数据,以便您可以向其添加__gc
元方法。