【问题标题】:Destructors in Lua?Lua 中的析构函数?
【发布时间】:2010-06-20 17:43:52
【问题描述】:

是否可以在没有使用用户数据的情况下在 Lua 中获取析构函数?

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

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

谢谢!

【问题讨论】:

    标签: lua destructor


    【解决方案1】:

    来自documentation on metatables

    元表可以控制对象在算术运算、顺序比较、连接、长度运算和索引中的行为。元表还可以定义在用户数据被垃圾回收时调用的函数。

    Lua 用户的 Lua 常见问题解答指出:

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

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

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

    所以你去吧,如果你想获得__gc 事件,你必须手动将你的表包装在用户数据中。

    【讨论】:

    • 请注意,Lua 5.2 不再是这种情况。 __gc 现在可以按您的预期工作。但是,依赖于这种新行为的代码在 5.1 解释器上运行时会静默失败(默认情况下 ubuntu 仍然提供该解释器)。
    • ... 或者几个包含 lua 的程序永远不会升级。
    猜你喜欢
    • 2021-02-08
    • 2011-02-25
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多