【问题标题】:Does Lua __gc metamethod now work for table (Lua 5.2.1) ?Lua __gc 元方法现在是否适用于表 (Lua 5.2.1) ?
【发布时间】:2012-12-15 07:04:08
【问题描述】:

我有点惊讶,因为我以前读过,__gc 元方法只对用户数据调用,从不对表调用。 (LuaFAQ : Why don't the __gc and __len metamethods work on tables?)

但是,最近,我尝试了它,发现它确实有效!用 Lua 5.2.1 试试这个代码:

do
  local b = setmetatable({a = 1}, {__gc = function(self) print(self.a); end});
end
collectgarbage();

但是我在任何地方都找不到此更新日志,所以我有点沮丧和害怕使用它。

也许,有人可以证明我的建议?或者这是一种无证行为? 对我来说,有一个常规的方法来创建表析构函数会很好,如果我的观察是正确的,我会很高兴。

【问题讨论】:

  • lua.org/versions.html#5.2 - “Lua 5.2 于 2011 年 12 月 16 日发布。它的主要新功能是 [...] 表格终结器。”

标签: garbage-collection lua destructor metatable


【解决方案1】:

Lua 5.2 Reference Manual 部分 2.5.1 表示表确实支持 __gc 元方法。具体来说,它说

对于要在收集时完成的对象(表或用户数据),您必须将其标记为完成。当您设置它的元表并且元表有一个由字符串“__gc”索引的字段时,您将对象标记为完成。

5.1 Reference Manual 中的类似文档说

使用 C API,您可以为用户数据设置垃圾收集器元方法

Lua 5.2 现在明确支持表的__gc 元方法似乎很明显。

【讨论】:

  • 哦,谢谢!我应该仔细阅读参考资料。我的眼睛在哪里。对不起,愚蠢的问题。
猜你喜欢
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2012-09-21
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多