是否可以使用userdata在Lua中获取析构函数?
http://www.lua.org/notes/ltn006.html看起来很有希望(实际上正是我想要的);除了它是Lua 4.0的路径。
基本上,我想要一种在收集表时调用函数的方法。
谢谢!
答案 0 :(得分:14)
来自documentation on metatables:
元表可以控制对象在算术运算,顺序比较,连接,长度操作和索引中的行为方式。 metatable还可以定义在垃圾收集用户数据时要调用的函数。
Lua用户的Lua FAQ说明:
为什么__gc和__len元方法不适用于表?
当对象即将被删除时,Userdata对象经常需要一些显式析构函数来运行,并且Lua为此提供了
__gc
元方法。但是,为了提高效率,表格上不允许这样做。通常,不需要在表上设置析构函数,因为该表将自动删除,然后表中包含的任何引用都将被正常垃圾回收。一种可能的解决方法是创建用户数据;使表成为userdata的环境表,并在表中放置对userdata的引用。 (确保这是对userdata的唯一引用。)当表变为可收集时,将运行userdata的
__gc
元方法;在发生这种情况之前,Lua实际上不会销毁该表,因为该表由userdata引用。
所以,如果你想获得__gc
事件,你必须手动将表格包装在userdata中。