参考动态多维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 建议的那样使用元方法...