2017-09-23 90 views
1

我被困在一个加载几个模块而不明确需要所有这些模块的简单问题上。
我的模块是寄存器地址和默认值的表

这里是目录结构,并且每个模块包含一个表(相同的名称作为模块本身)IG A01.lua具有A01 = {}等
加载几个需要单个需求的Lua模块

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

可以使用luafilesystem模块遍历在map/registers/目录中的文件,而且它们加载模块:

-- 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 

注意name = name:sub (1, #name-4)删除扩展,但我们没有检查,这是一个.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']