参考动态多维table
Reference Dynamic multidimensional table
我有一个嵌套的 table 的数据结构,可以是 N 深。例如
local data = {
[1] = {
[1] = { "stuff" },
[2] = {
[1] = { "stuff" },
[2] = { "more stuff" },
[3] = {
[1] = "deeper stuff"
}
}
}
现在我可以通过数据[2][3][1]引用“更深层次的东西”但是有没有一种方法可以将 2-3-1 存储为一个键,这样我就可以引用这个数据[key ] ?
我正在存储一组在非规范化 table 中转换和循环的动作。我希望能够引用此特定操作来自原始数据中的特定点 table。由于这是 n 级深度,是否有一种动态的方式来编写 [2][3][1]...[n]?
您不能拥有一个多维键。实现类似目标的唯一方法是使用 "2-3-1"
之类的字符串,然后将其用于 __index
元方法,将其转换为单独的键。
setmetatable(data, {
__index = function(t, k)
for index in k:gmatch("%d+") do
-- insert fancier error handling here
if not t then error("attempt to index nil") end
t = rawget(t, tonumber(index))
end
return t
end
})
print(data["2-3-1"]
或者您使用 table 作为密钥
setmetatable(data, {
__index = function(t, k)
for i,v in ipairs(k) do
if not t then error("attempt to index nil") end
t = rawget(t, v)
end
return t
end
})
print(data[{2,3,1}]
在__index.
中实现table访问当然还有更多的方法
如果数据是全局的,您还可以使用 load
并执行类似
的操作
local k = string.gsub("1-1-1", "(%d+)%-?", "[%1]")
local element = load("return data .. k")()
但是请不要仅仅为了执行此操作而将数据设为全局。
或者您编写了一个函数来执行此操作,而没有像 Egor 建议的那样使用元方法...
我有一个嵌套的 table 的数据结构,可以是 N 深。例如
local data = {
[1] = {
[1] = { "stuff" },
[2] = {
[1] = { "stuff" },
[2] = { "more stuff" },
[3] = {
[1] = "deeper stuff"
}
}
}
现在我可以通过数据[2][3][1]引用“更深层次的东西”但是有没有一种方法可以将 2-3-1 存储为一个键,这样我就可以引用这个数据[key ] ?
我正在存储一组在非规范化 table 中转换和循环的动作。我希望能够引用此特定操作来自原始数据中的特定点 table。由于这是 n 级深度,是否有一种动态的方式来编写 [2][3][1]...[n]?
您不能拥有一个多维键。实现类似目标的唯一方法是使用 "2-3-1"
之类的字符串,然后将其用于 __index
元方法,将其转换为单独的键。
setmetatable(data, {
__index = function(t, k)
for index in k:gmatch("%d+") do
-- insert fancier error handling here
if not t then error("attempt to index nil") end
t = rawget(t, tonumber(index))
end
return t
end
})
print(data["2-3-1"]
或者您使用 table 作为密钥
setmetatable(data, {
__index = function(t, k)
for i,v in ipairs(k) do
if not t then error("attempt to index nil") end
t = rawget(t, v)
end
return t
end
})
print(data[{2,3,1}]
在__index.
中实现table访问当然还有更多的方法如果数据是全局的,您还可以使用 load
并执行类似
local k = string.gsub("1-1-1", "(%d+)%-?", "[%1]")
local element = load("return data .. k")()
但是请不要仅仅为了执行此操作而将数据设为全局。
或者您编写了一个函数来执行此操作,而没有像 Egor 建议的那样使用元方法...