Scratch

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