gpt4 book ai didi

lua - 递归元方法__index?

转载 作者:行者123 更新时间:2023-12-03 07:50:34 25 4
gpt4 key购买 nike

如何扩展我的 __index 元方法,以便无论嵌套级别如何它都可以工作?我当前的方法仅适用于 data.raw.a1.a2,但不适用于 data.raw.b1.b2.b3 及以下内容。

data = {
raw = {}
}

setmetatable(data.raw, { __index = function(t,k)
t[k] = {}
return t[k]
end })

data.raw.a1.a2 = { foo = "bar" }
data.raw.b1.b2.b3 = { foo = "bar" } -- throws an error
data.raw.c1.c2.c3.c4 = { foo = "bar" } -- throws an error

我尝试添加第二个setmetatable,但这仅适用于多一层嵌套。

data = {
raw = {}
}

setmetatable(data.raw, { __index = function(t,k)
t[k] = {}
-- below is new
setmetatable(t[k], { __index = function(t,k)
t[k] = {}
return t[k]
end })
-- above is new
return t[k]
end })

data.raw.a1.a2 = { foo = "bar" }
data.raw.b1.b2.b3 = { foo = "bar" } -- now this works
data.raw.c1.c2.c3.c4 = { foo = "bar" } -- this still throws an error

我不知道如何进行递归,以便它适用于所有级别的嵌套。发送帮助。

最佳答案

使用构造函数创建带有元表的表,该元表具有 __index 元方法,当索引键不存在时,该元方法会递归调用构造函数来创建新的表深度。

这是一个精简示例,但可以编写它以重用元表。

local function nestable(t)
return setmetatable(t or {}, {
__index = function (self, key)
local new = nestable {}
rawset(self, key, new)
return new
end
})
end

local data = nestable {}

data.raw.a1.a2 = { foo = 'bar' }

print(data.raw.a1.a2.foo)

结果:

bar

关于lua - 递归元方法__index?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77251312/

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