目录

  1. 什么是 Lua 表
  2. 为什么要使用表
  3. Lua 表的定义与特性
  4. 代码示例
  1. 表常用函数
  2. 工作原理详解
  3. 优点与应用场景
  4. 常见问题与注意事项
  5. 参考资料与出站链接

什么是 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. 索引从 1 开始
  • 与 0 起点的语言不同。
  1. # 的局限
  • 只对连续数字索引有效,稀疏表需谨慎。
   local t = {1, 2, nil, 4}
   print(#t)  -- 2
  1. 引用传递
  • 赋值不复制表内容。
   local a = {1, 2}
   local b = a
   b[1] = 3
   print(a[1])  -- 3
  1. nil 删除
  • 设置键为 nil 删除键值对。

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 工具支持

如果您需要更复杂的表操作示例(如排序或深拷贝),请告诉我,我会进一步扩展!