目录
什么是 Lua 表
Lua 表 (table) 是 Lua 中最核心的数据结构,既可以作为数组(有序列表),也可以作为字典(键值对集合)。它是 Lua 中唯一的数据构造类型,其他复杂结构(如数组、对象)都通过表实现。
为什么要使用表
- 多功能性:同时支持数组和字典操作。
- 动态性:无需预定义大小或类型。
- 数据组织:高效管理复杂数据。
- 嵌入开发:作为 Lua 与宿主语言交互的基础。
Lua 表的定义与特性
- 定义:用
{}
创建,键可以是任意类型(除nil
),值也可以是任意类型。 - 索引:数字索引从 1 开始(数组部分),非数字索引作为键值对。
- 动态调整:支持运行时添加或删除元素。
- 引用类型:表是引用传递,赋值不复制内容。
代码示例
表的基本操作
-- 创建表
local t = {}
-- 添加元素
t[1] = "one"
t["key"] = "value"
-- 访问元素
print("t[1]: " .. t[1])
print("t['key']: " .. t["key"])
-- 删除元素
t["key"] = nil
print("删除后 t['key']: " .. tostring(t["key"]))
运行结果:
t[1]: one
t['key']: value
删除后 t['key']: nil
表作为数组
-- 数组形式
local colors = {"红", "绿", "蓝"}
-- 遍历
for i = 1, #colors do
print("颜色 " .. i .. ": " .. colors[i])
end
-- 添加元素
table.insert(colors, "黄")
print("添加后: " .. table.concat(colors, ", "))
运行结果:
颜色 1: 红
颜色 2: 绿
颜色 3: 蓝
添加后: 红, 绿, 蓝, 黄
表作为字典
-- 字典形式
local person = {
name = "张三",
age = 25,
city = "北京"
}
-- 访问与修改
print("姓名: " .. person.name)
person.age = 26
print("新年龄: " .. person.age)
-- 遍历
for k, v in pairs(person) do
print(k .. ": " .. v)
end
运行结果:
姓名: 张三
新年龄: 26
name: 张三
age: 26
city: 北京
嵌套表
-- 嵌套表
local students = {
{name = "李四", score = 90},
{name = "王五", score = 85}
}
-- 访问嵌套元素
print("学生 1: " .. students[1].name .. ", 分数: " .. students[1].score)
-- 遍历嵌套表
for i, student in ipairs(students) do
print("学生 " .. i .. ": " .. student.name .. ", " .. student.score)
end
运行结果:
学生 1: 李四, 分数: 90
学生 1: 李四, 90
学生 2: 王五, 85
表常用函数
函数 | 描述 | 示例 |
---|---|---|
table.insert(t, value) | 插入元素到数组部分 | table.insert(t, 5) |
table.remove(t, pos) | 删除数组指定位置元素 | table.remove(t, 1) |
table.concat(t, sep) | 连接数组元素为字符串 | table.concat({"a", "b"}, ",") → “a,b” |
#t | 获取数组长度 | #{"a", "b"} → 2 |
table.sort(t, comp) | 排序数组(可选比较函数) | table.sort({3, 1, 2}) → {1, 2, 3} |
工作原理详解
- 哈希表与数组:表内部分为数组部分(连续数字索引)和哈希部分(其他键)。
- 长度:
#
只计算数组部分的连续索引。 - 内存:表是引用类型,动态分配内存,键值对存储在哈希表中。
优点与应用场景
优点
- 通用:同时支持数组和字典。
- 灵活:动态扩展,键值类型不限。
- 高效:数组部分优化了访问速度。
应用场景
- 数组:列表、队列。
- 字典:配置、对象表示。
- 嵌套:复杂数据结构(如 JSON)。
常见问题与注意事项
- 索引从 1 开始:
- 与 0 起点的语言不同。
- # 的局限:
- 只对连续数字索引有效,稀疏表需谨慎。
local t = {1, 2, nil, 4}
print(#t) -- 2
- 引用传递:
- 赋值不复制表内容。
local a = {1, 2}
local b = a
b[1] = 3
print(a[1]) -- 3
- nil 删除:
- 设置键为
nil
删除键值对。
参考资料与出站链接
- 官方文档:
- 学习资源:
- 菜鸟教程 – Lua 表(中文)
- Lua Users – Tables(英文)
- 工具支持:
- ZeroBrane Studio:调试表。
如果您需要更复杂的表操作示例(如排序或深拷贝),请告诉我,我会进一步扩展!
发表回复