我想“解开”桌子上的金属钩,我想知道:
tbl = setmetatable(tbl, false) -- or nil这样做是正确的吗?我找不到任何关于如何正确做这件事的信息。我需要使用赋值操作员吗?
此外,如果metatable没有引用并且是匿名的,那么这是否足以破坏表上的可移植性?:
tbl = setmetatable({}, {__index = something})
-- later on:
tbl = nil垃圾收集器足够移除这两个表了吗?
发布于 2016-09-09 12:36:43
根据Lua引用,在这里提出问题之前,您应该始终参考它,setmetatable(tbl, nil)将删除表tbl的元数据,除非tbl的原始元数据受到保护。或者我们最好说,它不是删除元数据,而是删除对它的引用。当然,只要有其他引用,作为元意志的表就不会被删除。
在你问人们一个简单的函数调用是否有效之前,请自己尝试一下。您可以使用https://www.lua.org/cgi-bin/demo或任何其他Lua解释器,您可以在几秒钟内得到答案,而不涉及其他任何人。
运行以下代码:
setmetatable({}, false)或
setmetatable({})会导致
输入:1:对“setmetatable”的错误参数#2 (预期为零或表)
现在,您知道不能输入false,必须显式地输入零。
要查看参考手册中的__metatable内容,您可以尝试使用以下代码
local tbl = setmetatable({}, {__metatable = true})
setmetatable(tbl, nil)这将产生以下结果:
输入:2:无法更改受保护的元可
关于你问题的第二部分:
tbl = nil不会删除tbl引用的表。它只会删除对它的引用tbl。
local a = {}
local b = a
b = nil
print(a)A仍然是一张桌子。你只删除了其中一个参考资料。
一旦没有引用,垃圾收集器就可以收集表。
setmetatable(tbl, {})将建立对表构造函数{}返回的表的引用,并将该引用存储在tbl内部的某个地方。
如果tbl是对该表的最后引用,那么在某个时候它将被作为垃圾收集。当然,对您设置为metatable的表的唯一引用也将消失,并且它也将被删除。
如果你这样做的话:
local a = {}
local b = setmetatable({}, a),a = nil不会删除b的元可
因此,是的,如果没有其他对其中任何一个表的引用,它将删除这两个表。
https://stackoverflow.com/questions/39409835
复制相似问题