在 Lua 中,table
是最核心的数据结构,几乎所有复杂数据都依赖表来实现。Lua 标准库提供了一系列操作表的函数,主要集中在 table
模块中。以下是常用的 table
函数及其用法:
1. table.insert(t, [pos,] value)
功能:向表 t
中插入元素
pos
(可选):指定插入位置(索引),默认插入到表的末尾- 若表是数组(连续数字索引),插入后会自动调整后续元素的索引
示例:
local t = {10, 20, 30}
table.insert(t, 40) -- 插入到末尾 → {10, 20, 30, 40}
table.insert(t, 2, 15) -- 插入到索引2的位置 → {10, 15, 20, 30, 40}
2. table.remove(t, [pos])
功能:从表 t
中删除元素
pos
(可选):指定删除位置,默认删除最后一个元素- 删除后会自动调整后续元素的索引(仅对数组有效)
示例:
local t = {10, 15, 20, 30, 40}
table.remove(t) -- 删除最后一个元素 → {10, 15, 20, 30}
table.remove(t, 2) -- 删除索引2的元素 → {10, 20, 30}
3. table.concat(t, [sep, i, j])
功能:将表 t
中从索引 i
到 j
的元素拼接成字符串
sep
(可选):元素间的分隔符,默认无i
、j
(可选):起始和结束索引,默认从 1 到表长度
示例:
local t = {"Lua", "Python", "Java"}
print(table.concat(t)) -- 输出 "LuaPythonJava"
print(table.concat(t, ", ")) -- 输出 "Lua, Python, Java"
print(table.concat(t, " | ", 2, 3)) -- 输出 "Python | Java"
4. table.sort(t, [comp])
功能:对表 t
进行排序(仅对数组部分有效)
comp
(可选):比较函数,默认按升序排序- 比较函数格式:
function(a, b) return a < b end
(返回true
表示a
应在b
前)
- 比较函数格式:
示例:
local t = {3, 1, 4, 2}
table.sort(t) -- 默认升序 → {1, 2, 3, 4}
-- 自定义降序排序
table.sort(t, function(a, b) return a > b end) -- → {4, 3, 2, 1}
-- 对字符串排序
local words = {"banana", "apple", "cherry"}
table.sort(words) -- 按字母顺序 → {"apple", "banana", "cherry"}
5. table.maxn(t)
(Lua 5.1 及更早版本)
功能:返回表 t
中最大的数字索引(仅对数组有效)
- 在 Lua 5.2+ 中被
#t
(长度运算符)替代
示例:
local t = {10, 20, 30}
print(table.maxn(t)) -- 输出 3(最大索引是3)
local t2 = {[1] = 5, [5] = 10, [3] = 7}
print(table.maxn(t2)) -- 输出 5(最大数字索引是5)
6. 长度运算符 #t
(非函数,但常用)
功能:返回表 t
数组部分的长度(连续数字索引的最大索引)
- 注意:仅对连续的数字索引有效,若存在空洞(如
{1, [3]=3}
),结果可能不符合预期
示例:
local t = {10, 20, 30}
print(#t) -- 输出 3
local t2 = {1, 2, [5] = 5}
print(#t2) -- 输出 2(因为索引3、4不存在,视为数组结束)
7. table.unpack(t, [i, j])
(Lua 5.1)/ unpack(t, [i, j])
(Lua 5.2+)
功能:将表 t
中从索引 i
到 j
的元素作为多个值返回
- 常用于函数参数展开
示例:
local t = {10, 20, 30}
local a, b, c = table.unpack(t) -- a=10, b=20, c=30
-- 作为函数参数
local function sum(x, y, z) return x + y + z end
print(sum(table.unpack(t))) -- 输出 60(等价于 sum(10,20,30))
8. 遍历表的常用方式虽然不是 table 模块函数,但遍历表是高频操作:
local t = {name = "Lua", version = 5.1, {1, 2}, {3, 4}, 6, [10]="hello" ,8}
-- 1. 遍历数组部分(ipairs:仅遍历连续数字索引,从1开始)
for i, v in ipairs(t) do
print(i, v) -- 输出索引1和2的元素(子表)
end
print("*********************************")
-- 2. 遍历所有键值对(pairs:遍历所有键,包括字符串键和非连续数字键)
for k, v in pairs(t) do
print(k, v) -- 输出 name、version 及所有数字索引
end
print("*********************************")
-- 3. 遍历所有值(values)
for _, v in ipairs(t) do
print(v) -- 输出所有元素
end
print("*********************************")
-- 4. 遍历所有键(keys)
for k in pairs(t) do
print(k) -- 输出所有键
if type(k) == "number" then
print(t[k]) -- 输出所有数字索引的值
end
end
输出结果:
1 table: 0x11d00e980
2 table: 0x11d00e9e0
3 6
4 8
*********************************
1 table: 0x11d00e980
2 table: 0x11d00e9e0
3 6
4 8
name Lua
10 hello
version 5.1
*********************************
table: 0x11d00e980
table: 0x11d00e9e0
6
8
*********************************
1
table: 0x11d00e980
2
table: 0x11d00e9e0
3
6
4
8
name
10
hello
version
总结
函数 / 运算符 | 核心功能 | 适用场景 |
---|---|---|
table.insert |
插入元素 | 动态构建数组 |
table.remove |
删除元素 | 动态删除数组元素 |
table.concat |
拼接数组元素为字符串 | 字符串拼接、日志输出 |
table.sort |
排序数组 | 数据排序 |
#t |
获取数组长度 | 遍历、边界判断 |
table.unpack |
展开数组为多个值 | 函数参数传递 |
ipairs /pairs |
遍历表元素 | 数据读取、处理 |
这些函数是操作 Lua 表的基础,灵活运用它们可以高效处理数组、字典等各种数据结构。