王德发 发表于 2026-5-25 16:30:13

lua的模块与包


[*]模块:一个 .lua 文件就是一个模块,通常把一组相关的函数、变量、数据封装在这个文件里,对外暴露指定接口;
[*]包:多个功能相关的模块组成的集合(比如放在同一个目录下),Lua 中包的管理主要靠目录结构和 package.path 配置。
Lua 模块的本质是:把模块内的功能(函数、变量)挂载到一个 table 上,最后返回这个 table,让外部能访问到指定功能(未挂载的则为私有)。定义模块
Lua复制代码
-- 定义模块内的私有函数(仅模块内可用,不导出)local function check_num(num)    return type(num) == "number"end-- 定义模块的公开接口(挂载到 table 上)local mymath = {}-- 公开函数:加法function mymath.add(a, b)    if not (check_num(a) and check_num(b)) then      error("参数必须是数字")    end    return a + bend-- 公开函数:乘法function mymath.mul(a, b)    if not (check_num(a) and check_num(b)) then      error("参数必须是数字")    end    return a * bend-- 公开变量mymath.PI = 3.1415926-- 必须返回这个 table(核心!否则外部无法访问)return mymath加载模块外部文件通过 require("模块名") 加载模块,这是 Lua 加载模块的核心方式,有几个关键特性:
[*]模块名称不要和内置模块重名
[*]如果有目录关系,require的时候以 . 分隔

Lua复制代码
-- 加载模块(模块名不带 .lua 后缀)local mm = require("mymath")-- 调用模块的公开函数print(mm.add(3, 5))   -- 输出:8print(mm.mul(4, 6))   -- 输出:24print(mm.PI)          -- 输出:3.1415926-- 无法访问模块内的私有函数(check_num)-- print(mm.check_num(5))-- 报错:attempt to index field 'check_num' (a nil value)模块查找路径require 会根据 package.path 配置的路径查找模块文件,默认路径包含当前目录(./?.lua);如果模块不在默认路径下,需要手动修改 package.path:
Lua复制代码
-- 查看当前模块查找路径print(package.path)-- 添加自定义路径(比如模块放在 lib 目录下)package.path = package.path .. ";./lib/?.lua"-- 加载 lib 目录下的模块local utils = require("utils")包的管理当模块数量多的时候,需要按功能组织成 “包”(目录),核心是通过 init.lua 实现目录作为模块。比如创建一个 utils 包,包含 string.lua 和 math.lua 两个模块:
Lua复制代码
project/├── main.lua          # 主程序└── utils/            # 包目录    ├── init.lua      # 包的入口文件(关键)    ├── string.lua    # 字符串工具模块    └── math.lua      # 数学工具模块init.lua
Lua复制代码
-- utils/init.lualocal utils = {}-- 加载子模块并挂载到 utils 上utils.string = require("utils.string")utils.math = require("utils.math")-- 也可以导出常用函数到顶层function utils.trim(str)    return utils.string.trim(str)endreturn utils使用包
Lua复制代码
-- 加载 utils 包(实际加载 utils/init.lua)local utils = require("utils")-- 调用子模块的函数print(utils.string.trim("hello lua"))-- 输出:hello luaprint(utils.math.square(5))                -- 输出:25-- 调用顶层导出的函数print(utils.trim("test"))            -- 输出:test








页: [1]
查看完整版本: lua的模块与包