今天我们继续学习lua里的模块还有包
首先说一下这两个东西的概念
模块(module)
Lua 的模块是由变量、函数等已知元素组成的 table,然后把需要导出的常量、函数放入其中
特殊之处就是模块返回值 就是这个表
LUA已复制
-- utils.lua
local utils = {}
function utils.add(a, b)
return a + b
end
function utils.sub(a, b)
return a - b
end
return utils
但是怎么用呢,其实,Lua 模块 ≈ C# 的 命名空间 + 静态类 + 单例实例
相同含义的C#语句就是
C#已复制
namespace Utils
{
public static class Math
{
public static int Add(int a, int b) => a + b;
public static int Sub(int a, int b) => a - b;
}
}
使用就是不需要实现类的实例,直接using引入命名空间然后点语法使用里面的属性就行
C#已复制
using Utils;
class Program
{
static void Main()
{
int result = Math.Add(1, 2);
Console.WriteLine(result);
}
}
这里在lua中的使用方法就是使用require函数
require 函数
要使用文件使用一个模块使用require函数
已复制
require("<模块名>")
或者
已复制
require "<模块名>"
执行 require 后会返回一个由模块常量或函数组成的 table,并且还会定义一个包含该 table 的全局变量
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
然后我们在另外一个文件启用
LUA已复制
-- test_module.lua 文件
-- module 模块为上文提到到 module.lua
require("module")
print(module.constant)
module.func3()


但是大家可能会遇到的误区就是误以为模块里定义的表名就是文件名,其实不是的,
此时我们就可以把这个module.lua当做命名空间,然后modele.lua里面的属性和函数视作C#里的静态static函数,使用直接用点语法就行

包(package)
Lua里有一个全局变量:package
它其实是一个大工具箱,里面专门负责:
- 去哪里找模块
- 怎么加载模块
- 加载过的要不要再加载
主要的四个功能就是
① package.path (控制 Lua 模块搜索路径)
控制:Lua 去哪里找 .lua 文件
② package.loaded (缓存机制)
控制:模块是否重复加载
③ package.cpath(C模块)
用来找 .dll / .so
④ package.preload(虚拟模块)
手动注册模块(不需要文件)




评论区