2017-09-23 2 views
1

いくつかのモジュールをロードするという単純な問題に悩まされています。
私のモジュールは、レジスタアドレスとデフォルト値の表である。ここで

は、ディレクトリ構造であり、A01.luaはA01 = {}など
複数のLuaモジュールを1つのモジュールでロードする必要があります。

を有するIgの各モジュールは、テーブル(モジュール自体と同じ名前)が含まれ
main.lua 
map/registers/A01.lua 
map/registers/B20.lua 
map/registers/C31.lua -- [100+] 
map/registers/XYZ0119.lua 

私は

local regMap = require('map.registers.A01') 
regMap = require('map.registers.B20') -- and so on 

を使用して、個々のモジュールをロードすることができます。しかし、私はそれらの数百を持っているので、これは、最適ではありません。それらは書かれています

一度にすべてをインポートする方法はありますか?
または「必要な」基準で特定のテーブルを読み込む方法はありますか?

答えて

2

これは、Alban Linardの答えの "リメイク"ですが、外部ライブラリは使用していません。

-- Assume that all your files are inside "map/registers" folder 
-- (no recursive subdirectories search is performed) 

for filename in io.popen('ls -pUqAL "map/registers"'):lines() do  --Linux 
--for filename in io.popen('dir /b/a-d "map\\registers"'):lines() do --Windows 
    filename = filename:match"^(.*)%.lua$" 
    if filename then 
     require("map.registers."..filename) 
    end 
end 
+0

単に 'ls map/registers/*。lua'にするのはなぜですか? – lhf

+0

@lhf - 'mkdir map/registers/Misc_Modules.luaの後にtouch map/registers/Misc_Modules.lua/some_module.lua' requireは' some_module'をロードしようとしますが、それは失敗します –

+0

私の考えは、私は上記のファイルのいずれかのレジスタ名のいずれかが必要です。 –

1

あなたはmap/registers/ディレクトリ内のファイルを反復するluafilesystemモジュールを使用することができ、そして、彼らはモジュールをロード:name = name:sub (1, #name-4)は拡張子を削除

-- Luafilesystem allows to iterate over a directory. 
local Lfs = require "lfs" 

-- for each filename in the directory 
for filename in Lfs.dir "./map/registers/" do 
    -- if it is a file 
    if Lfs.attributes ("./map/registers/" .. filename, "mode") == "file" then 
    -- transform the filename into a module name 
    local name = "map/registers/" .. filename 
    name = name:sub (1, #name-4) 
    name = name:gsub ("/", ".") 
    -- and require it 
    require (name) 
    end 
end 

注ことが、我々はそれがあることを確認していません.luaファイル。

+0

このアプローチはかなりスマートですが、私はメタテーブルを使用することを好みます。 –

+0

はい、metatablesを使用すると、質問の最後のバージョンの方が良いです;-) –

0

これは、あなたが考えていたものはおそらくないですが、私はどうなる:

rm -f map/registers/all.lua 
(for f in map/registers/*.lua; do f="$(basename "$f" .lua)"; echo "require('map.registers.$f')"; done) > map/registers/all.lua 

そして、あなたのコード内

require("map.registers.all") 

を使用しています。ここで

0

は、このために私のソリューションです:

local regMap = {} -- Define Master table 

    -- Load a module whenever missing filed appears 
    setmetatable(regMap,{__index = function (t, k) 
     t[k] = require ('map.registers.' .. k) 
     return t[k] 
     end}) 

    -- Call any module 
    regMap['A01'] 
    regMap['B20'] 
関連する問題