Lua的破坏者?

ano*_*non 11 lua destructor

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

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

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

谢谢!

Mar*_*off 15

metatables文档:

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

Lua用户的Lua FAQ说明:

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

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

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

所以,如果你想获得__gc活动,你必须手动将表包装在userdata中.

  • 请注意,[Lua 5.2](http://www.lua.org/manual/5.2/manual.html#2.5.1)不再是这种情况.`__gc`现在可以正常工作了.但是,依赖于这种新行为的代码在5.1解释器上运行时会无声地失败(默认情况下ubuntu仍在运行). (3认同)