Прикрепление метатаблиц в пределах вкладок

У меня есть парсер, который анализирует файл конфигурации и создает таблицу.

Полученная таблица может выглядеть примерно так:

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

Цель состоит в том, чтобы иметь таблицу, из которой я могу читать настройки, и если настройки не существует, она попытается получить ее от своего родителя. На верхнем уровне это будет захватить от глобального. Если он не в глобальном, он вернет ноль.

Я прикрепляю метатаблицы к корню следующим образом:

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)

Однако при запросе ключей это не работает. Похоже, дело в том, что всегда ноль. Как мне читать из родительской таблицы?

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)
Другие вопросы по тегам