2016-09-08 19 views
2

我有一個名爲engine_api的函數與內聯文檔的巨大表。因爲它變得如此之大,我想讓它更加模塊化。將元數據中的值字符串轉換爲表以進行查找

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層深。 整件事是返回單個表的系統,使其他部分可以調用這個API是這樣的:

local api = require "engine_api" 

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

我仍然需要這樣的工作方式。但是我想要做的是將API的各個部分分成不同的文件。我想我可以使用metamethods來做到這一點。但是,當metamethod被查找時,該值實際上是一個字符串,所以這種天真的方法將無法工作。

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) 

相反,我似乎有做一堆,如果再else語句與字符串表名比較,然後返回該表,而不是字符串。是否有自動執行轉換的方法?

回答

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

隨時。一段時間以來,我一直在做類似的項目。 –

相關問題