使用单个require载入多个Lua模块

我卡在一个简单问题上,即如何在不明确要求所有模块的情况下载入多个模块。

我的模块是注册地址和默认值的表

以下是目录结构,每个模块都包含一个表(与模块本身同名),例如A01.lua有A01 = {}等

 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')-等等

但这不是最佳解决方案,因为我有数百个模块,它们将被覆盖

有没有一种方式可以一次导入所有模块?

或者是否有一种方法可以根据“需要”的基础上加载某个表?

点赞
用户162054
用户162054

你可以使用luafilesystem模块来遍历map/registers/目录中的文件,然后加载这些模块:

-- Luafilesystem 允许迭代目录。
local Lfs = require "lfs"

-- 遍历目录中的每个文件名
for filename in Lfs.dir "./map/registers/" do
  -- 如果它是一个文件
  if Lfs.attributes ("./map/registers/" .. filename, "mode") == "file" then
    -- 将文件名转换成模块名
    local name = "map/registers/" .. filename
    name = name:sub (1, #name-4)
    name = name:gsub ("/", ".")
    -- 然后将其载入
    require (name)
  end
end

请注意,name = name:sub (1, #name-4)将扩展名去掉,但我们没有检查它是否是.lua文件。

2017-09-23 09:32:26
用户1847592
用户1847592

这是 Alban Linard 答案的 “remake”,但是没有使用外部库。

-- 假设所有文件都在“map / registers”文件夹中(不进行递归子目录搜索)

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
2017-09-23 10:13:25
用户3677376
用户3677376

这可能不是你想要的,但我会这样做:

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")
2017-09-24 13:07:49
用户5525442
用户5525442

以下是我的解决方案:

local regMap = {} -- 定义主表

-- 当出现缺失字段时加载模块
setmetatable(regMap,{__index =  function (t, k)
    t[k] = require ('map.registers.' .. k)
    return t[k]
  end})

-- 调用任何模块
regMap['A01']
regMap['B20']
2017-09-25 03:14:46