Lua 中的 table 类型详解
table 是 Lua 中唯一的数据结构机制,它实现了关联数组的功能,可以用来表示普通数组、序列、符号表、集合、记录、图、树等几乎所有数据结构。
基本特性
- table 是 Lua 中唯一的数据结构类型
- 可以包含任意类型的值(nil 除外)
- 可以通过任意类型的值(nil 除外)作为键
- 大小不固定,可以动态增长
创建 table
-- 创建一个空表
local t1 = {}
-- 创建并初始化数组部分
local t2 = {10, 20, 30} -- 相当于 {[1]=10, [2]=20, [3]=30}
-- 创建并初始化键值对
local t3 = {name="Lua", version="5.4"}
访问 table 元素
local t = {name="Lua", age=28}
-- 点语法访问
print(t.name) -- 输出 "Lua"
-- 索引语法访问
print(t["name"]) -- 输出 "Lua"
-- 数组部分访问
local arr = {10, 20, 30}
print(arr[1]) -- 输出 10 (注意 Lua 数组索引默认从1开始)
修改 table
local t = {}
-- 添加/修改元素
t["key"] = "value"
t.key2 = "value2"
t[1] = "first element"
-- 删除元素
t.key = nil
遍历 table
local t = {a=1, b=2, c=3}
-- pairs 遍历所有键值对
for k, v in pairs(t) do
print(k, v)
end
-- ipairs 遍历数组部分(从1开始的连续整数索引)
local arr = {10, 20, 30}
for i, v in ipairs(arr) do
print(i, v)
end
常用 table 操作
Lua 提供了 table 标准库来处理 table:
local t = {3, 1, 4, 2}
-- 插入元素
table.insert(t, 5) -- 在末尾插入
table.insert(t, 2, 1.5) -- 在位置2插入
-- 移除元素
table.remove(t, 3) -- 移除位置3的元素
-- 排序
table.sort(t) -- 升序排序
table.sort(t, function(a, b) return a > b end) -- 降序排序
-- 连接
local s = table.concat(t, ", ") -- 用", "连接所有元素
多维 table
-- 创建二维数组
local matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
}
print(matrix[2][3]) -- 输出 6
-- 创建混合结构
local person = {
name = "Alice",
age = 25,
hobbies = {"reading", "swimming", "coding"},
address = {
city = "Beijing",
street = "Main St"
}
}
元表 (Metatable)
元表可以改变 table 的行为:
local t1 = {a = 1}
local t2 = {b = 2}
-- 设置元表
local mt = {
__add = function(t1, t2)
local result = {}
for k, v in pairs(t1) do result[k] = v end
for k, v in pairs(t2) do result[k] = v end
return result
end
}
setmetatable(t1, mt)
setmetatable(t2, mt)
local t3 = t1 + t2 -- 使用元方法 __add
print(t3.a, t3.b) -- 输出 1, 2
注意事项
- Lua 的 table 默认使用 1 作为数组的起始索引
- table 是引用类型,赋值和传参都是传递引用
- 使用
#
运算符可以获取数组部分的长度(连续整数索引部分) - nil 值会中断数组部分,
#
可能不会返回预期结果
table 是 Lua 中最重要、最灵活的数据结构,几乎所有的 Lua 程序都会大量使用 table。