Menu
CoddyTech

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 和对象使用。

操作语法
空 tablelocal t = {}
数组式(索引从 1 开始)local t = {10, 20, 30}
访问数组元素t[1](第一个元素)
map 式 tablelocal 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
嵌套 tablelocal m = {a = {1, 2}}

流程控制

代码块以 end 结束;只有 nil 和 false 为假。

操作语法
If / elseif / elseif 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
自定义 tostringmt.__tostring = function(t) ... end
基于原型的面向对象mt.__index = ClassTable

最常用的 Lua 语法,全都在这一页。这份 Lua 速查表是核心语言的快速参考:变量和类型、字符串、流程控制、函数,还有 table,它是 Lua 唯一的、也是非常灵活的数据结构。最后还简单介绍了标准库和元表。

这里的内容都是标准 Lua,用官方解释器就能运行。需要什么就复制什么,也可以在 Lua 在线编辑器里直接运行每个代码片段,无需安装。

Lua 速查表常见问题

这份 Lua 速查表免费吗?

免费。这份 Lua 速查表完全免费,也不用注册。把它加入书签,需要查 table 操作、字符串函数或流程控制关键字时随时回来看。

Lua 的 table 为什么既能当数组又能当 map?
table 本质上就是一组键值对,键可以是任意值。用从 1 开始的连续整数做键({10, 20, 30})时,table 就像数组;用字符串做键({name = "Ada"})时,它就像 map。你甚至可以在同一个 table 里混用两种方式。所以 Lua 只需要一种结构化类型:table 可以充当数组、字典、集合和对象。
Lua 的索引为什么从 1 开始?
按照约定和设计,Lua 的数组索引从 1 开始,而不是 0,所以 t[1] 是第一个元素,#t 就是元素个数。长度运算符 # 以及 table.insert、ipairs 这些库函数都默认采用从 1 开始的约定,遵守它,你的数组代码才能按预期工作。
可以在线练习 Lua 吗?

可以。打开 Lua 在线编辑器,就能在浏览器里运行这份速查表中的任何代码片段,无需安装 Lua。想系统地学,Coddy 的免费交互式 Lua 课程会带你从变量和 table 一步步学到函数和元表。

这份速查表适合初学者吗?

适合。内容从最常用的主题(变量、字符串、table、流程控制)排到进阶内容(标准库和元表),第一天就能用上前面几部分,其余的可以慢慢掌握。

Coddy 编程语言插图

在 Coddy 学习 Lua

开始