Lua __gc metamethod现在适用于表(Lua 5.2.1)吗?

时间:2012-12-31 00:33:59

标签: garbage-collection lua destructor metatable

我有点惊讶,因为我之前已经读过,__gc metamethod只调用userdata,而不调用table。 (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();

但是我找不到任何改变日志,所以我很沮丧并且害怕使用它。

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

1 个答案:

答案 0 :(得分:4)

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

  

对于要在收集时完成的对象(table或userdata),您必须将其标记为最终确定。在设置metatable时标记对象以进行最终化,并且metatable具有由字符串“__gc”索引的字段。

5.1 Reference Manual中的类似文档说

  

使用C API,您可以为userdata

设置垃圾收集器元方法

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