4

我正在为 Lua 编写一个模块。在关闭 lua 解释器时,即使用户忘记隐式调用关闭例程,它也必须运行清理例程。

该模块主要是用 C 语言编写的。

我应该使用 Lua C Api 中的什么回调来检测程序执行结束?我想到的唯一想法是在代表我的模块的表上使用 __gc 元方法。有任何想法吗?

4

1 回答 1

4

从 C 模块开始,简单的做法是使用元方法创建一个完整userdata的。将它存储在模块环境中的一个字段中,以便在卸载模块之前它不会被 GC 收集。metatable__gc

根据手册,只有收集器调用userdata他们的__gc元方法,所以你不能使用表格来保存模块的终结器。

对于一个用纯 Lua 编写的需要终结器的模块,你仍然需要一个userdata来支撑它。不受支持且未记录但广为人知的功能newproxy()可用于创建一个带有元表的其他空白userdata以用于此目的。调用它newproxy(true)来获取一个元表,并使用它getmetatable()来检索元表,以便您可以将元方法添加__gc到它。

于 2010-10-12T07:52:20.323 回答