2016-09-08 1 views
2

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

АНИ устанавливается следующим образом:

-- Engine API module 
local engine_api = { 
    engine = { 
    -- engine functions... 
    version = ... 
    }, 

    image = { 
    -- image functions... 

    jpeg = { 
     -- jpeg specific bits 
    }, 
    }, 

    project = { 
    -- project functions 
    } 
} 

return engine_api 

Как вы можете видеть, это более 2 уровней вложенности. Все это возвращается в виде одной таблицы, так что другие части системы можно назвать в этом апи так:

local api = require "engine_api" 

print("Engine version:", engine_api.engine.version()); 

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

local engine = { 
    -- engine functions... 
    version = function() 
    print("engine.version") 
    end 
} 

local image = { 
    -- image functions 
    get = function() 
    print("image.get") 
    end 
} 

local project = { 
    -- project functions 
    load = function() 
    print("project.load()") 
    end 
} 

-- Engine API module 
local engine_api = { 

} 

local engine_api_mt = { 
    __index = function(tbl, k) 
    print("k=", k) 
    return k 
    end 
} 

setmetatable(engine_api, engine_api_mt) 

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

ответ

2

Вы можете сделать engine_api один файл и требуют файлы внутри этой таблицы, например, так:

engine_api.lua:

local engine_api = { 
    engine = require("engine"), 
    image = require("image"), 
    project = require("project"), 
} 

return engine_api 

engine.lua:

local engine = { 
    version = function() 
     print("my version") 
    end 
} 

return engine 

И так далее , таким образом вы можете позвонить engine_api.engine.version() без каких-либо проблем. Я думаю, что metatable находится чуть выше, если вы не делаете что-то более конкретное?

+1

Doh! теперь это так очевидно. Спасибо Базилио! – Matt

+0

В любое время. Уже некоторое время работает над подобным проектом. –

Смежные вопросы