gpt4 book ai didi

lua - 在 Lua 中从表中删除元表

转载 作者:行者123 更新时间:2023-12-04 00:06:50 28 4
gpt4 key购买 nike

我想从表中“解开”一个元表,想知道是否:

tbl = setmetatable(tbl, false) -- or nil

这样做的正确方法是什么?我找不到有关如何正确执行此操作的任何信息。我需要使用赋值运算符吗?

另外,如果元表从来没有引用并且是匿名的,这是否足以破坏附加到表的元表?:
tbl = setmetatable({}, {__index = something})
-- later on:
tbl = nil

垃圾收集器足以删除两个表吗?

最佳答案

根据 Lua 引用资料,您在此处提出问题之前应始终咨询该引用资料,setmetatable(tbl, nil)将删除表 tbl 的元表除非 tbl 的原始元表受到保护。或者我们最好说它不会删除元表,而是删除对它的引用。作为元表的表当然不会被删除,只要有其他引用它。

在您询问人们一个简单的函数调用是否有效之前,请自己尝试一下。
您可以使用 https://www.lua.org/cgi-bin/demo或任何其他 Lua 解释器,您可以在几秒钟内得到答案,而无需其他任何人参与。

运行此代码:

setmetatable({}, false)

或者
setmetatable({})

会导致

input:1: bad argument #2 to 'setmetatable' (nil or table expected)



现在您知道不能输入 false 并且必须显式输入 nil。

要检查您会在引用手册中阅读的 __metatable 内容,您可以尝试使用此代码
local tbl = setmetatable({}, {__metatable = true})
setmetatable(tbl, nil)

这导致以下输出:

input:2: cannot change a protected metatable



对于您问题的第二部分:

tbl = nil 不会删除 tbl 引用的表。它只会删除对它的引用 tbl。
local a = {}
local b = a
b = nil
print(a)

a 仍然是一张 table 。您只删除了其中一个引用。

一旦没有引用,垃圾收集器就可以收集表。
setmetatable(tbl, {})将建立对表构造函数返回的表的引用 {}并将该引用存储在 tbl 的某个地方.

tbl是对该表的最后一次引用,它将在某个时候作为垃圾收集。当然,对您设置为元表的表的唯一引用也将消失,它也将被删除。

如果你这样做:
local a = {}
local b = setmetatable({}, a)

, a = nil不会删除 b 的元表

所以是的,如果没有留下对其中任何一个的其他引用,它将删除两个表。

关于lua - 在 Lua 中从表中删除元表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39409835/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com