Lua 速查表
最后更新
Hello World 与运行代码
Lua 非常精简,一条语句就能运行。
| 操作 | 语法 |
|---|---|
| 输出一行 | print("Hello, World!") |
| 输出多个值 | print("x", 1, true) |
| 输出但不换行 | io.write("Hi") |
| 注释 | -- this is a comment |
| 多行注释 | --[[ ... ]] |
| 拼接字符串 | print("Hi " .. name) |
| 运行文件 | lua app.lua |
| 交互式命令行 | lua |
变量与类型
变量默认是全局的;局部变量要用 local 声明。
| 操作 | 语法 |
|---|---|
| 局部变量 | local age = 30 |
| 全局变量 | count = 0 |
| 多重赋值 | local a, b = 1, 2 |
| 八种类型 | nil, boolean, number, string, table, function, userdata, thread |
| Nil / 布尔值 | nil, true, false |
| 检查类型 | type(x) 返回 "number" |
| 转换为数字 | tonumber("42") |
| 转换为字符串 | tostring(42) |
字符串
字符串是不可变的;单引号和双引号都可以用。
| 操作 | 语法 |
|---|---|
| 长度 | #s 或 string.len(s) |
| 拼接 | s1 .. s2 |
| 转大写 / 小写 | s:upper(), s:lower() |
| 截取子串 | s:sub(1, 3) |
| 查找子串 | s:find("ell") |
| 替换(gsub) | s:gsub("a", "b") |
| 格式化 | string.format("%05d", 42) |
| 长字符串 | [[ multi\nline ]] |
table(核心数据结构)
table 是 Lua 唯一的结构化类型,可以当数组、map 和对象使用。
| 操作 | 语法 |
|---|---|
| 空 table | local t = {} |
| 数组式(索引从 1 开始) | local t = {10, 20, 30} |
| 访问数组元素 | t[1](第一个元素) |
| map 式 table | local u = {name = "Ada", age = 30} |
| 访问 map 的值 | u.name 或 u["name"] |
| 设置值 | t[4] = 40, u.email = "a@x.com" |
| 数组部分的长度 | #t |
| 遍历数组(ipairs) | for i, v in ipairs(t) do ... end |
| 遍历所有键(pairs) | for k, v in pairs(u) do ... end |
| 嵌套 table | local m = {a = {1, 2}} |
流程控制
代码块以 end 结束;只有 nil 和 false 为假。
| 操作 | 语法 |
|---|---|
| If / elseif / else | if x > 0 then ... elseif x < 0 then ... else ... end |
| 逻辑运算符 | and, or, not |
| 数值 for 循环 | for i = 1, 10 do ... end |
| 带步长的 for 循环 | for i = 10, 1, -1 do ... end |
| while 循环 | while x < 100 do ... end |
| repeat-until 循环 | repeat ... until done |
| 跳出循环 | break |
| 不等于运算符 | if a ~= b then ... end |
函数
函数是一等值,可以返回多个结果。
| 操作 | 语法 |
|---|---|
| 定义函数 | function add(a, b) return a + b end |
| 局部函数 | local function square(x) return x * x end |
| 匿名函数 | local f = function(x) return x * 2 end |
| 返回多个值 | function bounds() return 1, 10 end |
| 接收多个返回值 | local lo, hi = bounds() |
| 可变参数函数 | function sum(...) ... end |
| 收集可变参数 | local args = {...} |
| 方法(冒号语法) | function obj:greet() ... end |
string 库
string 库中的常用函数(也可以写成 s:fn() 调用)。
| 函数 | 作用 |
|---|---|
string.len(s) | 字符串的长度 |
string.sub(s, i, j) | 从索引 i 到 j 的子串 |
string.upper(s) | 返回大写副本 |
string.rep(s, n) | 把字符串重复 n 次 |
string.find(s, p) | 查找模式,返回起止位置 |
string.match(s, p) | 返回第一个匹配结果 |
string.gsub(s, p, r) | 替换所有匹配项 |
string.format(fmt, ...) | 把值格式化成字符串 |
table 库与 math 库
处理数组式 table 和数字的工具函数。
| 函数 | 作用 |
|---|---|
table.insert(t, v) | 在末尾追加一个值 |
table.insert(t, i, v) | 在位置 i 插入 v |
table.remove(t, i) | 删除并返回位置 i 的元素 |
table.concat(t, ", ") | 把元素连接成字符串 |
table.sort(t) | 原地排序数组 |
math.floor(x) / math.ceil(x) | 向下取整 / 向上取整 |
math.max(...) / math.min(...) | 参数中的最大值 / 最小值 |
math.random(1, 6) | 范围内的随机整数 |
元表(简介)
元表可以自定义 table 的行为,比如运算符、索引等。
| 操作 | 语法 |
|---|---|
| 设置元表 | setmetatable(t, mt) |
| 获取元表 | getmetatable(t) |
| 键不存在时的后备值 | mt.__index = defaults |
| 用函数提供默认值 | mt.__index = function(t, k) ... end |
| 自定义加法 | mt.__add = function(a, b) ... end |
| 自定义 tostring | mt.__tostring = function(t) ... end |
| 基于原型的面向对象 | mt.__index = ClassTable |
最常用的 Lua 语法,全都在这一页。这份 Lua 速查表是核心语言的快速参考:变量和类型、字符串、流程控制、函数,还有 table,它是 Lua 唯一的、也是非常灵活的数据结构。最后还简单介绍了标准库和元表。
这里的内容都是标准 Lua,用官方解释器就能运行。需要什么就复制什么,也可以在 Lua 在线编辑器里直接运行每个代码片段,无需安装。
Lua 速查表常见问题
这份 Lua 速查表免费吗?
免费。这份 Lua 速查表完全免费,也不用注册。把它加入书签,需要查 table 操作、字符串函数或流程控制关键字时随时回来看。
Lua 的 table 为什么既能当数组又能当 map?
{10, 20, 30})时,table 就像数组;用字符串做键({name = "Ada"})时,它就像 map。你甚至可以在同一个 table 里混用两种方式。所以 Lua 只需要一种结构化类型:table 可以充当数组、字典、集合和对象。Lua 的索引为什么从 1 开始?
t[1] 是第一个元素,#t 就是元素个数。长度运算符 # 以及 table.insert、ipairs 这些库函数都默认采用从 1 开始的约定,遵守它,你的数组代码才能按预期工作。可以在线练习 Lua 吗?
可以。打开 Lua 在线编辑器,就能在浏览器里运行这份速查表中的任何代码片段,无需安装 Lua。想系统地学,Coddy 的免费交互式 Lua 课程会带你从变量和 table 一步步学到函数和元表。
这份速查表适合初学者吗?
适合。内容从最常用的主题(变量、字符串、table、流程控制)排到进阶内容(标准库和元表),第一天就能用上前面几部分,其余的可以慢慢掌握。