Reference 项目 Lua 5.4 速查表从基础语法到表、元表与文件 IO 的完整实战指南【免费下载链接】reference⭕ Share quick reference cheat sheet for developers.项目地址: https://gitcode.com/gh_mirrors/re/reference本篇技术指南以 Reference 开源速查表仓库中的 Lua 速查表 为骨架面向 Lua 5.4 编程语言系统覆盖变量与数据类型、运算符、条件与循环控制、函数定义与调用语法糖、string/math/table标准库 API以及用表和元表模拟类与继承、文件读写等实战主题。读完本文你将获得一份可直接对照上手、可复制运行的 Lua 快速参考手册同时理解这份速查表在 Reference 项目中的渲染机制与源码实现细节。准备工作如何在本地查看并运行本文示例本文所有 Lua 代码均以 Lua 5.4 语法编写如整数除法//、goto标签等特性可在本地 Lua 5.3 解释器中直接运行。在 Reference 仓库中本文所依据的原始文档位于 source/_posts/lua.md属于仓库source/_posts目录下众多速查表之一参见 README.md 中对项目结构与贡献方式的说明。文档正文经 Hexo 主题渲染后代码块会由markdown-it-highlightjs插件做语法高亮见 themes/coo/scripts/markdown_plugin.js因此文中所有 Lua 代码块均可在支持 Lua 的环境中原样运行验证。快速入门Hello World、变量与数据类型Hello WorldLua 中最简单的程序一行即可print(Hello, World!) -- Hello, World! -- 当实参是单个字符串或表字面量时可以省略括号 print Hello, World! -- Hello, World! print [[multi-line Hello World]]第一行是标准写法第二行展示了 Lua 的语法糖——如果函数调用只传一个字符串字面量可以省略括号第三行使用长括号[[...]]表示多行字符串。这也是 Lua 文档中介绍Hello World程序时的标准示范。变量与动态类型Lua 是动态类型语言类型只属于值而不属于变量local age 18 -- 局部变量 boys, girls 2, 3 -- 全局变量 -- 多变量同时赋值x 1, y 2, z 3多余的 4 被丢弃 x, y, z 1, 2, 3, 4 -- 未定义的变量返回 nil这不是错误 foo anUnknownVariable -- 现在 foo nil -- 变量默认是全局的除非用 local 显式声明为局部变量要点多返回值赋值遵循值多则丢弃、值少则补 nil的规则访问未定义变量不会报错而是得到nil。八种基础数据类型值类型说明number表示双精度数值string表示文本nil区分有值与没有值booleantrue或falsefunction表示子程序函数userdata表示任意 C 语言数据thread表示独立的执行线程协程table键值对字典也可作数组其中table是 Lua 唯一的数据结构既可用于数组下标访问也可用于键值映射后文「表基础」与「表操作」会深入展开。此外在「数据类型 API」一节还会看到type()、tonumber()等与数据类型相关的全局函数。标准输入输出-- 向标准输出或文件写入数据 io.write(Enter your name: ) -- 从用户或文件读取输入可指定格式*l 表示行、*n 表示数字、*a 表示读取全部 name io.read() io.write(Enter your age: ) age io.read()io.read()不带参数时默认按行读取。io.write与io.read同样作用于文件句柄后文「文件 IO」会展示完整示例。注释-- 这是单行注释--[[ 这是多行注释 可以跨越多行 --]]单行注释以--开头多行注释使用--[[ ... --]]或--[[ ... ]]包裹。运算符速查算术运算符-- 加法 result 10 30 -- 40 -- 减法 result 40 - 10 -- 30 -- 乘法 result 50 * 5 -- 250 -- 除法浮点除法 result 16 / 4 -- 4.0 -- 整除Lua 5.3 引入 result 16 // 4 -- 4 -- 取模 result 25 % 2 -- 1 -- 幂运算 result 5 ^ 3 -- 125 -- 一元负号 a 12 result -a -- -12注意/始终执行浮点除法16 / 4得到4.0而//是 Lua 5.3 起引入的整数除法这正是本文速查表面向 Lua 5.4 的原因之一。关系运算符a 10 b 20 -- 相等 print(a b) -- false -- 不相等注意 Lua 用 ~ 而非 ! print(a ~ b) -- true -- 大于 print(a b) -- false -- 小于 print(a b) -- true -- 大于等于 print(a b) -- false -- 小于等于 print(a b) -- true逻辑运算符-- and第一个操作数为假则返回它否则返回第二个操作数 false and nil -- false 0 and 20 -- 20 10 and 20 -- 20 -- or第一个操作数为真则返回它否则返回第二个操作数 true or false -- true 10 or 0 -- 10 12 or 4 -- 12 -- not逻辑取反 not true -- falseLua 中只有nil和false为假值0与空字符串都是真值这一特性决定了and/or的返回值语义也是实现三元表达式的基础。条件控制if-else 语句num 15 if num 10 then print(num is greater than 10) elseif num 10 then print(num is smaller than 10) else print(num is 10) endLua 使用elseif连写表示分支使用end结束整个块。基于只有 nil 与 false 为假的规则可以模拟 C/JavaScript 中的三元运算符-- 等价于 a ? b : c ans aBoolValue and yes or no -- 若 aBoolValue 为真则为 yes否则为 no循环结构while 循环i 1 while i 5 do print(i) i i 1 endfor 循环-- 数值型 for(起始值, 结束值, 步长) for i 1, 5, 1 do print(i) end -- 泛型 for遍历表 t {10, 20, 30} for k, v in ipairs(t) do print(k, v) -- 依次打印 1 10、2 20、3 30 end数值型 for 的第三个参数步长可省略默认 1ipairs专用于数组部分连续整数键的顺序遍历pairs则遍历表中所有键值对顺序不保证二者的区别在「全局函数」一节有对比示例。repeat-until 循环i 1 repeat print(i) i i 1 until i 5repeat-until至少执行一次循环体条件写在末尾。break 跳出循环while x do if condition then break end endcontinue用 goto 实现Lua 5.4 没有专门的continue关键字但可以用goto标签模拟-- 打印 1 到 10 中的偶数 for i 1, 10 do if i % 2 1 then goto continue end print(i) ::continue:: endgoto是 Lua 5.2 起加入的语法配合标签::continue::可实现类 continue 的控制流。函数定义、调用与语法糖定义函数function myFunction() return 1 end function myFunctionWithArgs(a, b) -- ... end -- 函数作为参数 function operate(a, b, func) return func(a, b) end -- 匿名函数 function (parameters) -- 函数体 end -- 匿名函数赋值给变量 local greet function(name) return Hello, .. name end -- 声明为 local 的函数不会作为模块的导出 local function myPrivateFunction() end -- 变长参数Splats function doAction(action, ...) print(Doing ..action.. to, ...) end调用函数myFunction() print(greet(Lua)) -- 输出: Hello, Lua -- 函数作为参数调用 local result operate(5, 3, function(x, y) return x y end) print(result) -- 输出: 8 -- 变长参数的实际使用 doAction(write, Shirley, Abed) -- Doing write to Shirley Abed省略括号的语法糖当函数实参是单个字符串字面量或表字面量时可以省略括号print Hello World -- print(Hello World) dofile a.lua -- dofile (a.lua) print [[a multi-line -- print([[a multi-line message]] message]]) f{x10, y20} -- f({x10, y20}) type{} -- type({})这种写法让 Lua 代码读起来更接近领域专用语言也是许多 Lua 配置式 API如setmetatable(obj, {...})常见风格的来源。数据类型 API 详解全局函数assert断言local my_table {} assert(my_table, my_table should exist!) -- 不会失败 local a nil -- 会抛出运行时错误错误信息为 a is nil assert(a, a is nil)type类型查询local my_var 10 print(type(my_var)) -- number local my_str hello print(type(my_str)) -- string local my_func function() end print(type(my_func)) -- functiondofile 与 loadfile加载并执行 Lua 文件-- dofile立即执行文件 dofile(my_file.lua) -- 立即执行 my_file.lua -- loadfile先编译为函数需要时再执行便于错误处理 local my_func loadfile(my_file.lua) if my_func then -- 文件语法有效现在执行它 my_func() else print(Error loading file.) end两者的差异在于dofile一步到位直接执行而loadfile仅编译不执行返回可调用的函数语法错误时返回 nil适合需要校验或延迟执行如热更新的场景。pairs 与 ipairs遍历表local my_table {10, hello, 20, name Lua} print(Using pairs:) for key, value in pairs(my_table) do print(key, value) end print(Using ipairs:) for key, value in ipairs(my_table) do print(key, value) endpairs会遍历全部键值对包括name Lua这类字符串键顺序不保证ipairs只遍历从 1 开始的连续整数键部分此处为 1 到 3 的三个元素遇到空洞即停止。tonumber字符串转数字local num1 tonumber(34) print(num1, type(num1)) -- 34 number local num2 tonumber(34.5) print(num2, type(num2)) -- 34.5 number local num3 tonumber(abc) print(num3) -- nil转换失败 local hex_num tonumber(8f, 16) print(hex_num) -- 1438 * 16 15第二个参数指定进制如 16 表示十六进制转换失败时返回nil而非报错。字符串操作s Hello拼接..s .. there -- Hello there常用方法s:upper() -- HELLO s:lower() -- hello s:len() -- 5 s:find(o) -- 5返回子串起始下标 s:reverse() -- olleHsub子串截取local s programming s:sub(3, 7) -- (截取第 3 到第 7 个字符) ogramgsub全局替换s:gsub() -- (替换所有匹配项可接受模式与替换函数)rep 与 chars ha s:rep(3) -- 重复 3 次 - hahaha local s_char string.char(72, 101, 108, 108, 111) print(s_char) -- Helloformat格式化输出local name Alice local age 30 local formatted string.format(My name is %s and I am %d years old., name, age) print(formatted) -- My name is Alice and I am 30 years old.其他常用方法s:match() -- 模式匹配返回第一个匹配的捕获 s:gmatch() -- 迭代器式全局模式匹配 s:dump() -- 序列化将值转为可加载的字符串表示 s:byte() -- 返回字符的字节码数值注意string.format的占位符体系与 C 语言printf一致%s字符串、%d整数、%f浮点数等。数学库 mathmath库提供完整的数学函数以下是速查表收录的常用函数及其语义math.abs(-5) -- 5 -- 返回 x 的绝对值。math.acos(1) -- 0 -- 返回 x 的反余弦弧度。math.asin(0) -- 0 -- 返回 x 的反正弦弧度。math.atan(y, x) -- y/x 的反正切 -- 返回 y/x 的反正切弧度根据两个参数的符号确定所在象限。math.ceil(x) -- 大于或等于 x 的最小整数 -- 返回不小于 x 的最小整数值。math.cos(x) -- x 的余弦 -- 返回 x 的余弦x 以弧度表示。math.deg(x) -- 弧度转角度 -- 将角度 x弧度转换为度数。math.exp(x) -- e^x -- 返回 e 的 x 次幂e 为自然对数的底。math.floor(x) -- 小于或等于 x 的最大整数 -- 返回不大于 x 的最大整数值。math.fmod(x, y) -- x 除以 y 的余数 -- 返回 x 除以 y 的余数符号与 x 相同。math.log(x, base) -- 以 base 为底 x 的对数 -- 返回 x 在指定 base 下的对数未提供 base 时默认取自然对数。math.max(x, ...) -- 最大参数 -- 返回所有参数中的最大值。math.min(x, ...) -- 最小参数 -- 返回所有参数中的最小值。math.modf(x) -- 整数部分与小数部分 -- 返回两个数x 的整数部分与小数部分。math.pow(x, y) -- x^y -- 返回 x 的 y 次幂。math.rad(x) -- 角度转弧度 -- 将角度 x度数转换为弧度。math.random(m, n) -- 随机数 -- 返回伪随机数。无参数时返回 [0, 1) 区间的浮点数一个参数 n 时返回 [1, n] 的整数两个参数 m、n 时返回 [m, n] 的整数。math.sin(x) -- x 的正弦 -- 返回 x 的正弦x 以弧度表示。math.sqrt(x) -- x 的平方根 -- 返回 x 的非负平方根。math.tan(x) -- x 的正切 -- 返回 x 的正切x 以弧度表示。表基础数组、字典与混合表-- 数组式表下标从 1 开始 local colors {red, green, blue} print(colors[1]) -- red -- 字典式表 local user {name Jane, age 25} print(user.name) -- Jane print(user[age]) -- 25 -- 混合表 local mixed {1, two, key value} print(mixed[1]) -- 1 print(mixed.key) -- value -- 获取数组式表的长度 print(#colors) -- 3Lua 表的下标从1开始这与大多数编程语言不同是新手最容易踩的坑。表操作 table 库local my_table {10, 20} -- insert追加到末尾 table.insert(my_table, 30) -- insert在指定位置插入 table.insert(my_table, 1, 2) -- 在位置 1 插入 2 -- remove删除指定位置的元素 table.remove(my_table, 3) -- 默认数值排序升序 local numbers {5, 2, 8, 1} table.sort(numbers) -- {1, 2, 5, 8} -- 自定义排序降序 local numbers_desc {5, 2, 8, 1} table.sort(numbers_desc, function(a, b) return a b end) -- {8, 5, 2, 1} -- concat将数组元素拼接为字符串 local fruit {apple, banana, cherry} local fruit_string table.concat(fruit, , ) print(fruit_string) -- apple, banana, cherrytable.sort的第二参数是可选比较函数返回true表示第一个参数应排在第二个之前table.concat的第二个参数是元素之间的分隔符。进阶用表和元表实现类、继承与运算符重载用原型模式模拟类Lua 本身没有内建的类机制但可以通过表和元表组合出不同的类实现方案。核心思路是构造一个既能存数据又能存函数的表。Dog {} function Dog:new() newObj {sound woof} self.__index self return setmetatable(newObj, self) end function Dog:makeSound() print(I say .. self.sound) end mrDog Dog:new() mrDog:makeSound() -- I say woof这里Dog:new()中的冒号语法等价于Dog.new(self)setmetatable(newObj, self)把Dog表设置为newObj的元表并通过self.__index self让实例在找不到字段时回退查找Dog从而实现方法继承。继承LoudDog Dog:new() function LoudDog:makeSound() s self.sound .. print(s .. s .. s) end seymour LoudDog:new() seymour:makeSound() -- woof woof woofLoudDog通过Dog:new()获得Dog作为原型再覆写makeSound方法即完成了方法重写式的继承seymour的查找链为seymour - LoudDog - Dog。更完整的类示例带构造参数与状态Account {} function Account:new(balance) local t setmetatable({}, { __index Account }) -- 构造函数逻辑 t.balance (balance or 0) return t end function Account:withdraw(amount) print(Withdrawing .. amount .. ...) self.balance self.balance - amount self:report() end function Account:report() print(Your current balance is: ..self.balance) end a Account:new(9000) a:withdraw(200) -- 方法调用这个示例展示了三个要点用(balance or 0)提供默认值用setmetatable({}, { __index Account })建立查找链方法内部通过self读写实例状态并调用其他方法。元表Metatable运算符重载与行为覆写元表本质上是一个装着函数的普通表通过给另一个表设置元表可以覆写该表的默认行为mt {} mt.__tostring function() return lol end mt.__add function(b) ... end -- 覆写 a b mt.__mul function(b) ... end -- 覆写 a * b mt.__index function(k) ... end -- 覆写查找 (a[k] 或 a.k) mt.__newindex function(k, v) ... end -- 覆写赋值 (a[k] v)应用元表mytable {} setmetatable(mytable, mt) print(myobject)元表是 Lua 元编程能力的核心__index/__newindex控制读写行为类继承正是基于__index实现__add/__mul等算术元方法实现运算符重载__tostring控制print的输出表现__call还能让表可被调用。文件 IO读写实战-- 写入模式 local file io.open(test.txt, w) if file then file:write(Hello from Lua!) io.close(file) end -- 读取模式 local file io.open(test.txt, r) if file then local content file:read(*a) -- 读取全部内容 print(content) io.close(file) endio.open的第二个参数为模式字符串w表示写入覆盖r表示只读a表示追加r/w等表示读写。file:read(*a)读取整个文件也可改用*l一行或*n一个数字。文件句柄同样支持io.write/io.read一节的*l、*n、*a三种格式读写后记得用io.close释放句柄。附这份速查表在 Reference 项目中的落地机制作为 Reference 速查表集合的一员本 Lua 速查表的渲染与检索依赖仓库中的以下实现细节卡片式布局原文档中形如{.col-span-2 .row-span-2}的类属性由markdown-it-attrs插件解析H2/H3 标题区块则由 themes/coo/scripts/markdown_plugin.js 中的headerSections规则包装成h2-wrap/h3-wrap/section的嵌套卡片结构代码示例因此呈现为速查表式的分栏卡片。语法高亮themes/coo/scripts/markdown_plugin.js 通过markdown-it-highlightjs接入 highlight.js对lua语言的代码块进行高亮未知语言则自动降级为纯文本。搜索与索引themes/coo/scripts/global.js 会为每篇文章生成search.json收录本文的标题title: Lua、分类categories: Programming、标签tags: script, interpret与导读intro前端即可据此做站内检索。页面渲染themes/coo/layout/post.ejs 将 front matter 中的intro字段渲染为页面导语正文内容原样输出这就是你在速查表页面看到的标题与简介区。若你想在本地浏览该速查表可参照 README.md 的开发流程克隆仓库后安装依赖运行npm run dev启动开发服务器访问http://127.0.0.1:4000即可预览全部速查表页面。【免费下载链接】reference⭕ Share quick reference cheat sheet for developers.项目地址: https://gitcode.com/gh_mirrors/re/reference创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
TCP端口为什么是65535?从16位字段到实践排查全解析 1. 从一道“送命题”说起做网络开发、运维或者后端服务的同学,几乎都遇到过这样一幕:面试官漫不经心地问一句“TCP/UDP端口的范围为什么是0到65535,总共65536个?为什么不是65535个?”——注意,这里已经有一… · 2026/9/24 23:53:42
ESP32与W5500 SPI通信失败的三大时序根源解析 1. 为什么你写的 SPI 总是“通不了”?——从 ESP32 和 W5500 的握手失败说起我第一次把 ESP32 和 W5500 焊上 PCB 板,通电后串口打印出W5500 init failed的那一刻,盯着那行红字看了足足三分钟。不是没接线,不是没供电,… · 2026/9/24 23:53:42
ESP32上运行WebAssembly:原理、解释器与实战指南 1. 从“鸡同鸭讲”到“同声传译”:先弄清CPU和WASM到底什么关系先抛一个反直觉的结论:ESP32的CPU不认识WebAssembly,但ESP32上跑的“翻译官”认识,而且这个翻译官本身是一段CPU认识的机器码。很多刚接触WASM(WebAssemb… · 2026/9/24 23:53:42
深度学习新闻分类推荐系统:从TextCNN到个性化推荐 简介:这份基于深度学习的新闻分类推荐系统Python实现源码,是专为课程设计与期末大作业准备的高分项目,下载后无需修改即可运行,适用于需要快速交付完整课题的高校学生。系统涵盖新闻数据预处理、文本分类模型训练、推荐逻辑展示等… · 2026/9/24 23:59:53
汽车电子底层软件开发:AUTOSAR与CAN总线实战解析 1. 这门“汽车电子底层软件开发就业课”到底在教什么?——不是写个LED闪烁就能上岗的很多人看到“汽车电子底层软件开发就业课”这个标题,第一反应是:不就是嵌入式C语言单片机CAN通信?刷几道LeetCode、调通一个STM32 CAN收发例程&… · 2026/9/24 23:59:53
Vim基础操作全攻略:保存退出、模式切换与高频命令实战 1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保… · 2026/9/24 23:59:53
Python+CNN车牌识别实战:从数据预处理到模型训练与部署 简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据… · 2026/9/24 23:59:53
AI元人文:从工具使用到思维重构的深度探索 最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决… · 2026/9/24 23:59:53