微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

参考动态多维表

如何解决参考动态多维表

我有一个嵌套表的数据结构,可以是 N 深。例如

local data = {
  [1] = {
     [1] = { "stuff" },[2] = {
     [1] = { "stuff" },[2] = { "more stuff" },[3] = {
        [1] = "deeper stuff"
     }
  }
}

现在我可以通过 data[2][3][1] 引用“更深的东西”但是有没有办法可以将 2-3-1 存储为一个键,以便我可以引用这个 data[key] ?

我正在存储一组在非规范化表中转换和循环的操作。我希望能够引用此特定操作来自原始数据表中的特定点。由于这是 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"]

或者您使用表格作为键

setmetatable(data,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中的表访问。

如果数据是全局的,您还可以使用 load 并执行类似的操作

local k = string.gsub("1-1-1","(%d+)%-?","[%1]")
local element = load("return data .. k")()

但是请不要将数据设为全局,以便您可以这样做。

或者您编写一个函数来执行此操作,而无需使用 Egor 建议的元方法...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。