使用单个require载入多个Lua模块
2017-9-25 3:2:30
收藏:0
阅读:165
评论:4
我卡在一个简单问题上,即如何在不明确要求所有模块的情况下载入多个模块。
我的模块是注册地址和默认值的表
以下是目录结构,每个模块都包含一个表(与模块本身同名),例如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')-等等
但这不是最佳解决方案,因为我有数百个模块,它们将被覆盖
有没有一种方式可以一次导入所有模块?
或者是否有一种方法可以根据“需要”的基础上加载某个表?
点赞
用户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
这可能不是你想要的,但我会这样做:
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
以下是我的解决方案:
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
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

你可以使用
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文件。