将metatable中的值字符串转换为表以进行查找

时间:2016-09-08 21:29:54

标签: lua

我有一个巨大的函数表,名为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语句来比较表名和字符串,然后返回表而不是字符串。有没有办法自动执行转换?

1 个答案:

答案 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只是在顶部,除非你做的更具体?