Discordia(Luvit)中require加载自定义模块无数据的问题解决
问题解决方法
1. 修复require("filename")无法加载自定义模块的问题
Luvit的require默认优先检索系统模块和框架自带模块,自定义模块需要手动添加当前目录到模块查找路径。在主文件最开头添加以下代码:
package.path = package.path .. ";./?.lua"
之后就能直接用require("filename")加载同目录下的自定义模块,无需写./前缀和.lua后缀。
2. 解决模块内自定义数据无法被主文件获取的问题
Lua模块的代码运行在独立的局部环境中,模块里声明的"全局变量"其实是该环境的局部变量,主文件根本访问不到。正确做法是让模块主动返回需要暴露的数据:
错误的模块写法(示例)
-- commands.lua Commands = { ping = function(msg) msg:reply("Pong!") end }
正确的模块写法
-- commands.lua local Commands = { ping = function(msg) msg:reply("Pong!") end } return Commands
主文件的正确调用方式
-- 主文件 package.path = package.path .. ";./?.lua" local Commands = require("commands") -- 此时可以正常访问Commands内的内容 -- 比如触发ping命令:Commands.ping(message)
原理说明
Luvit加载模块时会将模块代码包裹在一个匿名函数中执行,模块内的全局变量仅作用于这个函数内部。只有通过return语句将对象传递出来,主文件才能通过require的返回值拿到这些数据。
内容的提问来源于stack exchange,提问作者freziyt223
相关产品推荐
相关产品推荐

