Lua __gc 元方法现在适用于表(Lua 5.2.1)吗?

Sea*_*ull 3 lua garbage-collection destructor metatable

我有点惊讶,因为我之前读过,该__gc元方法仅针对用户数据调用,而从不针对表调用。(LuaFAQ:为什么 __gc 和 __len 元方法不能在表上工作?

但是最近我尝试了一下,发现确实有效!在 Lua 5.2.1 上尝试以下代码:

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

但我在任何地方都找不到这方面的变更日志,所以我有点沮丧并且不敢使用它。

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

Lil*_*ard 5

Lua 5.2参考手册第2.5.1节指出表确实支持__gc元方法。具体来说,它说

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

5.1参考手册中的类似文档说

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

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