模块类似于一个封装库,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()    -->这是一个私有函数!