lua #
https://cloudwu.github.io/lua53doc/manual.html https://www.lua.org/manual/5.3/ https://www.lua.org/manual/5.4/
module #
To define a module:
-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
-- 定义一个常量
module.constant = "这是一个常量"
-- 定义一个函数
function module.func1()
io.write("这是一个公有函数!\n")
end
local function func2()
print("这是一个私有函数!")
end
function module.func3()
func2()
end
return module
To import & use it:
require("module")
-- 现在有全局变量 module
print(module.constant)
-- or
-- require "module"
-- 或者给加载的模块定义一个别名变量,方便调用:
-- local m = require('module')
在 Lua 5.1 中,模块系统(使用 module 函数)会自动创建全局变量,但这在后续版本中被废弃了。
搜索路径 #
Lua 使用 package.path 和 package.cpath 这两个字符串来定义搜索路径。
- package.path 用于 Lua 脚本文件。
- package.cpath 用于 C 动态链接库。
package.path 的默认值 #
通常包含以下路径模式:
./?.lua /usr/local/share/lua/5.x/?.lua /usr/local/share/lua/5.x/?/init.lua
具体路径可能因 Lua 安装方式和操作系统而异。
搜索过程 #
当调用 require(“modulename”) 时,Lua 会:
- 首先检查 package.loaded 表,看模块是否已经加载。
- 如果未加载,则按照 package.searchers 中定义的顺序搜索模块。
替换规则 #
在 package.path 中,? 会被替换为模块名。
例如,对于 require(“foo”),Lua 可能会尝试打开 ./foo.lua、/usr/local/share/lua/5.x/foo.lua 等。
自定义搜索路径 #
可以修改 package.path 来添加自定义路径:
package.path = package.path .. ";/my/custom/path/?.lua"
目录结构 #
-
如果模块名包含点(如 require(“foo.bar”)),Lua 会将点替换为目录分隔符。例如,可能会搜索 foo/bar.lua。
-
init.lua 文件:
如果模块名对应一个目录,Lua 会尝试加载该目录下的 init.lua 文件。
- C 模块:
对于 C 模块,Lua 使用 package.cpath 来搜索 .so(Unix)或 .dll(Windows)文件。
自定义加载器 #
可以通过修改 package.searchers 表来添加自定义的模块加载器。
环境变量 #
LUA_PATH 和 LUA_CPATH 环境变量可以用来设置额外的搜索路径。
示例:
-- 打印当前的 package.path
print(package.path)
-- 添加自定义路径
package.path = package.path .. ";/home/user/mymodules/?.lua"
-- 加载模块
local mymodule = require("mymodule")