【发布时间】:2010-06-20 17:43:52
【问题描述】:
是否可以在没有使用用户数据的情况下在 Lua 中获取析构函数?
http://www.lua.org/notes/ltn006.html 看起来很有希望(实际上正是我想要的);除了它是 Lua 4.0 的路径。
基本上,我想要一种在收集表时调用函数的方法。
谢谢!
【问题讨论】:
标签: lua destructor
是否可以在没有使用用户数据的情况下在 Lua 中获取析构函数?
http://www.lua.org/notes/ltn006.html 看起来很有希望(实际上正是我想要的);除了它是 Lua 4.0 的路径。
基本上,我想要一种在收集表时调用函数的方法。
谢谢!
【问题讨论】:
标签: lua destructor
来自documentation on metatables:
元表可以控制对象在算术运算、顺序比较、连接、长度运算和索引中的行为。元表还可以定义在用户数据被垃圾回收时调用的函数。
Lua 用户的 Lua 常见问题解答指出:
为什么 __gc 和 __len 元方法不适用于表?
当对象即将被删除时,Userdata 对象经常需要一些显式的析构函数来运行,为此 Lua 提供了
__gc元方法。但是,为了提高效率,这在表格上是不允许的。一般情况下,不需要对表设置析构函数,因为表会被自动删除,表中包含的任何引用都会被正常回收。一种可能的解决方法是创建用户数据;将该表设为 userdata 的环境表,并在表中放置对 userdata 的引用。 (确保这是对 userdata 的唯一引用。)当表变为可收集时,将运行 userdata 的
__gc元方法; Lua 实际上不会在此之前销毁该表,因为该表是由用户数据引用的。
所以你去吧,如果你想获得__gc 事件,你必须手动将你的表包装在用户数据中。
【讨论】:
__gc 现在可以按您的预期工作。但是,依赖于这种新行为的代码在 5.1 解释器上运行时会静默失败(默认情况下 ubuntu 仍然提供该解释器)。