2016-09-08 3 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つの以上のレベルの深です。私はまだそれがこのように動作する必要が

local api = require "engine_api" 

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

: 全体のことは、このようなので、システムの他の部分は、このAPIを呼び出すことができ、単一のテーブルとして返されます。しかし、私がしたいのは、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) 

代わりに、私はその後、else文は、文字列でテーブル名を比較して、テーブルではなく、文字列を返すように場合の束をしなければならないように見えます。自動的に変換を実行する方法はありますか?

答えて

2

あなたはengine_api 1つのファイルを作成し、そのテーブル内のファイルを必要とし、そのようなことができます。

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()と呼ぶことができます。全く問題はありません。もっと具体的なことをしない限り、メタテーブルは一番上にあると思いますか?

+1

Doh!今は明らかだ。ありがとうBasilio! – Matt

+0

いつでも。今でも似たようなプロジェクトに取り組んでいます。 –

関連する問題