Lua 模块的完整入门指南

一、什么是模块?

从本质上讲,Lua 模块就是存储在自己文件中的一段可复用代码。

二、创建你的第一个模块

黄金法则:模块就是一个返回(return)表的 Lua 文件。

让我们创建一个简单的数学工具模块。

  1. 创建一个名为 mymath.lua 的新文件。
  2. 在其中放入以下代码:
lua 复制代码
-- 文件:mymath.lua
-- 1. 创建一个局部表来保存我们模块的函数和数据。
--    使用 'M' 代表 'module' 是一个常见的约定。
local M = {}

-- 2. 定义函数并将它们添加到我们的表中。
--    这些函数现在是我们模块表的"方法"。
function M.add(a, b)
    return a + b
end

function M.subtract(a, b)
    return a - b
end

function M.multiply(a, b)
    return a * b
end

function M.divide(a, b)
    if b == 0 then
        return nil, "除数不能为零"
    end
    return a / b
end

-- 模块中可用的常量
M.PI = 3.14159
M.VERSION = "1.0.0"

-- 3. 最重要的步骤:在文件末尾返回这个表。
--    这使得其中的所有函数和数据对其他脚本可用。
return M

就是这样!你已经创建了一个模块。注意所有东西都整洁地保存在 M 表内。

三、使用 require 来使用你的模块

现在,我们使用内置的 require 函数在另一个文件中使用我们这个 mymath

  1. 同一目录 中创建另一个名为 main.lua 的文件。
  2. 在其中放入以下代码:
lua 复制代码
-- 文件:main.lua

-- 使用 'require' 来加载我们的模块。
-- 注意:你不需要包含 '.lua' 扩展名。
-- 'require' 返回 mymath.lua 返回的表。
local mymath = require("mymath")

-- 现在我们可以使用模块中的函数了!
local sum = mymath.add(10, 5)
print("和:", sum) -- 输出: 和: 15

local difference = mymath.subtract(10, 5)
print("差:", difference) -- 输出: 差: 5

local product = mymath.multiply(10, 5)
print("积:", product) -- 输出: 积: 50

local quotient, err = mymath.divide(10, 0)
if quotient then
    print("商:", quotient)
else
    print("错误:", err) -- 输出: 错误: 除数不能为零
end

-- 我们也可以访问模块中的数据。
print("圆周率约等于:", mymath.PI) -- 输出: 圆周率约等于: 3.14159
print("模块版本:", mymath.VERSION) -- 输出: 模块版本: 1.0.0

require 的工作原理:

  • 它搜索指定的模块文件(例如,mymath.lua)。
  • 它运行该文件内的代码只执行一次
  • 它存储(缓存)该模块文件 return 的值。
  • 如果你在其他地方再次 require 同一个模块,Lua 不会重新运行文件;它会立即给你缓存的返回值。这既智能又高效!

结语

点个赞,关注我获取更多实用 Lua 技术干货!如果觉得有用,记得收藏本文!

相关推荐
广州华水科技20 分钟前
单北斗GNSS变形监测系统在水利工程安全保障中的应用与优势分析
前端
yqcoder30 分钟前
CSS 外边距重叠(Margin Collapsing):现象、原理与完美解决方案
前端·css
山楂树の1 小时前
图像标注大坑:img图片 + Canvas 叠加标注,同步放大后标注位置偏移、对不齐?详解修复方案及亚像素处理原理
前端·css·学习·canva可画
本山德彪1 小时前
我做了一个拼豆图纸生成器,把照片秒变图纸
前端
DTrader2 小时前
用TS无法实盘量化? - 实盘均线策略
前端·api
进击的夸父2 小时前
vfojs:Vue 超集架构,外壳React灵魂Vue
前端
编程老船长2 小时前
解决不同项目需要不同 Node.js 版本的问题
前端·vue.js
Wect2 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·算法·typescript
漫游的渔夫2 小时前
前端开发者做 Agent:别写成一次请求,用 5 步受控循环防止 AI 乱跑
前端·人工智能·typescript
kyriewen3 小时前
Webpack vs Vite:一个是“老黄牛”,一个是“猎豹”,你选谁?
前端·webpack·vite