模块类似于一个封装库,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。
创建自定义模块module.lua,
-- 文件名为 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 --可给加载的模块定义一个别名变量。如果没有返回值,默认会返回一个布尔类型,表示该模块是否加载过
在调用module.lua之前先来看看lua的加载机制。
加载机制
对于自定义的模块,模块文件不是放在哪个文件目录都行,函数 require 有它自己的文件路径加载策略,它会尝试从 Lua 文件或 C 程序库中加载模块。
require 用于搜索 Lua 文件的路径是存放在全局变量 package.path 中,当 Lua 启动后,会以环境变量 LUA_PATH 的值来初始这个环境变量。如果没有找到该环境变量,则使用一个编译时定义的默认路径来初始化。
当然,如果没有 LUA_PATH 这个环境变量,也可以自定义设置,在当前用户根目录下打开 .profile 文件(没有则创建,打开 .bashrc 文件也可以),例如把 “~/lua/” 路径加入 LUA_PATH 环境变量里:
#LUA_PATH
export LUA_PATH="~/lua/?.lua;;"
文件路径以 “;” 号分隔,最后的 2 个 “;;” 表示新加的路径后面加上原来的默认路径。接着,更新环境变量参数,使之立即生效。
source ~/.profile
这里使用我本地的package.path的值:
.\?.lua;C:\Program Files (x86)\LuaStudio\lua\?.lua;C:\Program Files (x86)\LuaStudio\lua\?\init.lua;C:\Program Files (x86)\LuaStudio\?.lua;C:\Program Files (x86)\LuaStudio\?\init.lua;C:\Program Files (x86)\Lua\5.1\lua\?.luac;D:\5.0\LuaFramework_UGUI\Assets\LuaFramework\Lua\Game\?.lua
那么在require “module”时就会尝试打开以下文件目录去搜索目标文件。
.\module.lua;
C:\Program Files (x86)\LuaStudio\lua\module.lua;
C:\Program Files (x86)\LuaStudio\lua\module\init.lua;
C:\Program Files (x86)\LuaStudio\module.lua;
C:\Program Files (x86)\LuaStudio\module\init.lua;
C:\Program Files (x86)\Lua\5.1\lua\module.luac;
D:\5.0\LuaFramework_UGUI\Assets\LuaFramework\Lua\Game\module.lua
C盘上的是我安装luastudio的位置,D盘上是我当前文件的位置。也就是我要打开module文件的目录。
-- 方式一
-- test_module.lua 文件
-- module 模块为上文提到到 module.lua
-- 别名变量 m
local m = require("module") --在module.lua中需要一个return module
-- print(package.path)
print(m.constant)
m.func3()
--方式二
require("module")
print(module.constant) -->这是一个常量
module.func3() -->这是一个私有函数!