我有一个巨大的函数表,名为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来做到这一点。但是当查找元方法时,该值实际上是一个字符串,所以这种天真的方法是行不通的。
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)
相反,我似乎必须做一堆if then else语句来比较表名和字符串,然后返回表而不是字符串。有没有办法自动执行转换?
答案 0 :(得分:2)
您可以将git push --delete origin changes-for-pull-request
git branch -d changes-for-pull-request # note lower-case "-d"
作为单个文件,并要求该表中的文件,如下所示:
engine_api.lua:
engine_api
engine.lua:
local engine_api = {
engine = require("engine"),
image = require("image"),
project = require("project"),
}
return engine_api
依此类推,这样你就可以毫无问题地致电local engine = {
version = function()
print("my version")
end
}
return engine
。我认为metatable只是在顶部,除非你做的更具体?