楼主: 洛霜
121 0

[其他] Lua 数据结构详解 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-4-20
最后登录
2018-4-20

楼主
洛霜 发表于 2025-11-27 15:01:23 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在 Lua 编程语言中,表(Tables)是唯一内置的复合数据结构,具备极强的灵活性与扩展性。通过合理使用表,开发者可以实现数组、字典、集合乃至对象等多种数据组织形式。本文将深入讲解表的不同使用方式及其高级特性——元表(Metatables),帮助理解其核心机制与实际应用。

1. 表:Lua 中的核心数据结构

Lua 的表是一种关联数组,既能用数字索引访问元素,也能以任意非 nil 值作为键来存储数据,因此可同时支持多种数据结构模式。

1.1 索引式表(模拟数组)

Lua 并没有独立的数组类型,而是通过表和整数索引来模拟实现。默认情况下,索引从 1 开始。
-- 创建一个表示水果列表的数组式表
local fruits = {"苹果", "香蕉", "橙子", "葡萄"}

-- 访问第一个和最后一个元素
print("第一个水果:", fruits[1])
print("最后一个水果:", fruits[4])

-- 获取元素总数
print("水果数量:", #fruits)

-- 方法一:通过数值循环遍历
print("\n遍历数组:")
for i = 1, #fruits do
    print("索引 ", i, ": ", fruits[i])
end

-- 方法二:使用 ipairs 进行安全遍历
print("\n使用 ipairs 遍历:")
for index, value in ipairs(fruits) do
    print("索引 ", index, ": ", value)
end

1.2 键值对表(模拟字典)

当需要通过名称或唯一标识符查找数据时,表可以作为键值对容器使用,类似于其他语言中的字典或哈希表。
-- 定义一个人的基本信息
local person = {
    name = "张三",
    age = 30,
    job = "工程师",
    married = true
}

-- 使用点号或方括号访问字段
print("姓名:", person.name)
print("年龄:", person["age"])

-- 修改已有属性
person.age = 31
print("修改后的年龄:", person.age)

-- 添加新字段
person.city = "北京"
print("新增的城市:", person.city)

-- 删除字段(设为 nil)
person.married = nil
print("删除后的婚姻状态:", person.married)  -- 输出 nil

-- 遍历所有键值对
print("\n遍历字典:")
for key, value in pairs(person) do
    print("键:", key, "值:", value)
end

1.3 混合型表(数组 + 字典)

一个表可以同时包含连续的数字索引部分和任意键的非数组部分,形成混合结构。
-- 创建一个兼具数组和字典特性的表
local mixed = {
    "元素1", "元素2",        -- 数组部分(索引 1 和 2)
    name = "混合表",         -- 字典部分
    id = 1001
}

-- 使用 pairs 遍历全部元素(顺序不保证)
print("\n遍历混合表:")
for key, value in pairs(mixed) do
    print("键:", key, "值:", value)
end

1.4 嵌套表(构建复杂结构)

表中可以包含其他表,从而构造出多维数组、树形结构或类似对象的数据模型。
-- 学生信息列表,每位学生包含成绩子表
local students = {
    {name = "李四", age = 20, scores = {math = 85, english = 90}},
    {name = "王五", age = 22, scores = {math = 92, english = 88}}
}

-- 访问嵌套数据
print("第一个学生的英语成绩:", students[1].scores.english)
print("第二个学生的数学成绩:", students[2].scores.math)

2. 元表(Metatables)——改变表的行为

元表是一种特殊的表,用于定义另一个表在进行某些操作时的自定义行为,如算术运算、比较、访问控制等。
-- 定义两个基础表
local t1 = {10, 20}
local t2 = {30, 40}

-- 定义元表 mt,包含 __add 和 __tostring 元方法
local mt = {
    -- 自定义加法操作:拼接两个表的内容
    __add = function(a, b)
        local result = {}
        for i, v in ipairs(a) do
            result[i] = v
        end
        for i, v in ipairs(b) do
            result[#result + 1] = v
        end
        return result
    end,

    -- 自定义字符串输出格式
    __tostring = function(t)
        local str = "{ "
        for i, v in ipairs(t) do
            str = str .. v
            if i < #t then
                str = str .. ", "
            end
        end
        str = str .. " }"
        return str
    end
}

-- 将元表绑定到 t1 和 t2
setmetatable(t1, mt)
setmetatable(t2, mt)

-- 执行加法操作(触发 __add)
local t3 = t1 + t2
print("t1:", tostring(t1))
通过上述示例可以看出,元表赋予了普通表更丰富的语义能力,使得 Lua 在不增加语法复杂度的前提下实现了高度可定制的数据行为。
-- 表作为集合使用
通过表可以实现集合的相关功能,利用键来存储元素,值统一设为 true。
local set = {}
set["apple"] = true
set["banana"] = true
set["orange"] = true

-- 判断元素是否存在于集合中
print("apple 在集合中:", set["apple"] ~= nil)
print("grape 在集合中:", set["grape"] ~= nil)

-- 从集合中移除某个元素
set["banana"] = nil
print("删除后 banana 在集合中:", set["banana"] ~= nil)

-- 遍历并输出集合中的所有元素
print("\n集合中的元素:")
for element in pairs(set) do
    print(element)
end



-- 表作为栈的实现
使用表能够模拟栈结构,遵循“后进先出”的原则。
local stack = {}

-- 定义入栈操作
function push(item)
    table.insert(stack, item)
end

-- 定义出栈操作
function pop()
    return table.remove(stack)
end

-- 对栈进行测试
push("A")
push("B")
push("C")
print("栈顶元素:", pop())
print("栈顶元素:", pop())
print("栈顶元素:", pop())

[此处为图片2]

-- 表作为队列的应用
表同样可用于实现队列,满足“先进先出”的特性。
local queue = {}

-- 入队操作:在队尾添加元素
function enqueue(item)
    table.insert(queue, item)
end

-- 出队操作:移除并返回队首元素
function dequeue()
    return table.remove(queue, 1)
end

-- 测试队列行为
enqueue(1)
enqueue(2)
enqueue(3)
print("队首元素:", dequeue())
print("队首元素:", dequeue())
print("队首元素:", dequeue())

[此处为图片3]

-- 表的常见操作方法
Lua 提供了多种内置函数用于处理表数据。
local testTable = {5, 2, 8, 1, 9}

-- 对表进行升序排序
table.sort(testTable)
print("\n排序后的表:")
for i, v in ipairs(testTable) do
    print(v)
end

-- 在指定位置插入新元素(在索引 3 处插入 10)
table.insert(testTable, 3, 10)
print("\n插入元素后的表:")
for i, v in ipairs(testTable) do
    print(v)
end

-- 删除指定索引处的元素(删除索引为 2 的元素)
table.remove(testTable, 2)
print("\n删除元素后的表:")
for i, v in ipairs(testTable) do
    print(v)
end

[此处为图片4]

-- 总结说明
Lua 中的表是一种极为灵活且强大的数据结构,支持多种用途:
- 可以充当数组、字典、混合型表格或嵌套结构;
- 借助元表机制,可自定义表的行为,实现如运算符重载等功能;
- 能够用来模拟集合、栈、队列等典型数据结构;
- 拥有丰富的标准库函数支持,例如排序、插入和删除操作。

掌握表的各种使用方式,有助于开发者构建高效且适应性强的数据管理方案,以应对多样化的编程场景。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据结构 function tostring Students Married

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-5 16:56