Lua 5.2.1中,Lua的__gc元方法是否可以用于表?

我有点惊讶,因为我之前读过,__gc 元方法仅针对用户数据调用,而不会针对表调用。( LuaFAQ: 为什么 __gc 和 __len 元方法不适用于表?

但是,最近我尝试了一下,发现它确实有效!请尝试使用 Lua 5.2.1 运行以下代码:

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

但我找不到任何有关此内容的更新日志,所以我有点沮丧和担心使用它。

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

点赞
用户582
用户582

Lua 5.2 参考手册2.5.1 章节表明,表支持 __gc 元方法。具体来说,

为了使对象(表或用户数据)在收集时能够被释放,必须将它标记为待释放。当你设置对象的元表并且这个元表有一个以字符串 "__gc" 为键的字段时,就将它置为待释放状态。

5.1 参考手册中有类似的文档,这里说到

使用 C API,你可以为用户数据设置垃圾回收元方法。

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

2012-12-31 00:39:28