Lua的破坏者?

时间:2010-06-20 06:50:11

标签: lua destructor

是否可以使用userdata在Lua中获取析构函数?

http://www.lua.org/notes/ltn006.html看起来很有希望(实际上正是我想要的);除了它是Lua 4.0的路径。

基本上,我想要一种在收集表时调用函数的方法。

谢谢!

1 个答案:

答案 0 :(得分:14)

来自documentation on metatables

  

元表可以控制对象在算术运算,顺序比较,连接,长度操作和索引中的行为方式。 metatable还可以定义在垃圾收集用户数据时要调用的函数。

Lua用户的Lua FAQ说明:

  

为什么__gc和__len元方法不适用于表?

     

当对象即将被删除时,Userdata对象经常需要一些显式析构函数来运行,并且Lua为此提供了__gc元方法。但是,为了提高效率,表格上不允许这样做。

     

通常,不需要在表上设置析构函数,因为该表将自动删除,然后表中包含的任何引用都将被正常垃圾回收。一种可能的解决方法是创建用户数据;使表成为userdata的环境表,并在表中放置对userdata的引用。 (确保这是对userdata的唯一引用。)当表变为可收集时,将运行userdata的__gc元方法;在发生这种情况之前,Lua实际上不会销毁该表,因为该表由userdata引用。

所以,如果你想获得__gc事件,你必须手动将表格包装在userdata中。