【问题标题】:attaching metatables within tabes在桌子内连接金属桌子
【发布时间】:2015-12-30 05:06:15
【问题描述】:

我有解析配置文件并生成表格的解析器。

生成的表格可能类似于:

root = {
 global = {
 },
 section1 = {
   subsect1 = {
     setting = 1
     subsubsect2 = {
     }
   }
 }
}

我们的目标是有一个表,我可以从中读取设置,如果设置不存在,它会尝试从它的父级获取它。在顶层,它将从全局中获取。如果它不在全局中,它将返回 nil。

我像这样将元表附加到根目录:

local function attach_mt(tbl, parent)
    for k,v in pairs(tbl) do
      print(k, v)
      if type(v) == 'table' then
        attach_mt(v, tbl)
        setmetatable(v, {
          __index = function(t,k)
            print("*****parent=", dump(parent))
            if parent then
              return tbl[k]
            else
              if rawget(tbl, k) then
                return rawget(tbl, k)
              end
            end
            print(string.format("DEBUG: Request for key: %s: not found", k))
            return nil
          end
        })
      end
    end
  end

  attach_mt(root)

但是,在请求密钥时它不起作用。情况似乎总是为零。如何从父表中读取?

【问题讨论】:

  • 您的意思是return tbl[k] 还是return parent[k]
  • 就是这样!谢谢我修好了
  • 嗯,几乎解决了。不从全局获取。
  • 是的,这不是正常的嵌套顺序,因此需要明确(或添加到嵌套顺序中)。正如在对我的回答的评论中指出的那样,修复实际上是另一种方式。将if parent then 修复为if tbl then,您根本不需要parent(实际上是祖父母)参数。
  • 谢谢,是的,我意识到发生了什么,并明确地将另一个元表添加到 root 以从全局获取。我也跳过了在“全局”上添加元表,不需要那里的 rawget 东西

标签: lua lua-table metatable meta-method


【解决方案1】:
local function attach_mt(tbl, parent)
   setmetatable(tbl, {__index = parent or root.global})
   for k, v in pairs(tbl) do
      if type(v) == 'table' then
         attach_mt(v, tbl)
      end
   end
end
attach_mt(root)
setmetatable(root.global, nil)

【讨论】:

  • 天才,谢谢你,这实际上要简单得多,对我来说也很有意义。
猜你喜欢
  • 1970-01-01
  • 2014-10-14
  • 2023-03-31
  • 2021-04-19
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
相关资源
最近更新 更多