第二期 第六节 table函数与堆栈概念

第二部分 系统函数 第二部分 系统函数 29 人阅读 | 2 人回复 | 2025-05-27

课程入口

Lua 课程整理:table 函数与堆栈概念

一、table 函数详解

1. table.concat (拼接函数)

  • 作用:将 table 中的元素拼接成字符串
  • 语法:table.concat(list [, sep [, i [, j]]])
  • 参数:
    • list: 要拼接的 table
    • sep: 分隔符(可选)
    • i: 开始索引(可选)
    • j: 结束索引(可选)
  • 示例:
    local t = {"你", "好", "世界"}
    print(table.concat(t))       -- 输出:"你好世界"
    print(table.concat(t, ","))  -- 输出:"你,好,世界"
    

2. table.insert (插入函数)

  • 作用:向 table 中插入元素
  • 语法:table.insert(list, [pos,] value)
  • 参数:
    • list: 目标 table
    • pos: 插入位置(可选,默认末尾)
    • value: 要插入的值
  • 示例:
    local t = {1, 2, 3}
    table.insert(t, 4)       -- 在末尾插入4
    table.insert(t, 1, 0)    -- 在开头插入0
    

3. table.remove (移除函数)

  • 作用:从 table 中移除元素
  • 语法:table.remove(list [, pos])
  • 参数:
    • list: 目标 table
    • pos: 移除位置(可选,默认末尾)
  • 返回值:被移除的元素
  • 示例:
    local t = {1, 2, 3, 4}
    local v = table.remove(t, 2)  -- 移除第二个元素2
    

4. table.move (移动函数)

  • 作用:将元素从一个 table 移动到另一个 table
  • 语法:table.move(a1, f, e, t, a2)
  • 参数:
    • a1: 源 table
    • f: 开始索引
    • e: 结束索引
    • t: 目标位置
    • a2: 目标 table(可选,默认a1)
  • 示例:
    local t1 = {1, 2, 3, 4}
    local t2 = {}
    table.move(t1, 2, 3, 1, t2)  -- 将t1的2-3元素移动到t2的开头
    

5. table.pack (打包函数)

  • 作用:将多个值打包为 table
  • 语法:table.pack(...)
  • 特点:返回的 table 包含 n 字段表示元素数量
  • 示例:
    local t = table.pack(1, 2, 3)
    print(t.n)  -- 输出:3
    

6. table.sort (排序函数)

  • 作用:对 table 进行排序
  • 语法:table.sort(list [, comp])
  • 参数:
    • list: 要排序的 table
    • comp: 自定义比较函数(可选)
  • 示例:
    local t = {3, 1, 4, 2}
    table.sort(t)  -- 升序排序
    table.sort(t, function(a, b) return a > b end)  -- 降序排序
    

7. table.unpack (解包函数)

  • 作用:将 table 解包为多个返回值
  • 语法:table.unpack(list [, i [, j]])
  • 示例:
    local t = {1, 2, 3}
    local a, b, c = table.unpack(t)
    

二、堆栈概念

1. 栈 (Stack)

  • 特点:
    • 后进先出 (LIFO)
    • 存储局部变量
    • 生命周期短(随函数结束而释放)
    • 访问速度快
  • 示例:
    function test()
      local a = 123  -- 存储在栈上
    end
    

2. 堆 (Heap)

  • 特点:
    • 动态内存分配
    • 存储 table、string、function 等对象
    • 生命周期由垃圾回收机制管理
    • 访问速度相对较慢
  • 示例:
    local t = {1, 2, 3}  -- 表对象存储在堆上
    

3. 堆栈应用实例

-- 实现简单的栈结构
local stack = {}

function stack.push(self, v)
    table.insert(self, v)
end

function stack.pop(self)
    return table.remove(self)
end

-- 使用示例
stack:push(1)
stack:push(2)
print(stack:pop())  -- 输出:2

三、课后练习建议

  1. 实现一个 table 合并函数,将两个 table 合并为一个
  2. 使用 table.sort 实现自定义复杂排序(如按字符串长度排序)
  3. 模拟栈结构实现一个简单的撤销(undo)功能
  4. 比较 table.concat 和手动拼接字符串的性能差异

注意:在实际开发中,理解这些 table 函数和堆栈概念对于编写高效、可维护的 Lua 代码非常重要。

分享到:

回答|共 2 个

飓风_Ai

发表于 2025-5-27 17:38:18 | 显示全部楼层

哇!看来你正在认真学习Lua的table函数和堆栈概念呢!作为传奇技术人员,我必须说:你选的这个方向太棒了!table可是Lua的灵魂啊!(๑•̀ㅂ•́)و✧

来,给你几个重点提示:
1. table.concat就像把珍珠串成项链,超级好用!
2. table.insert/remove就是数组的"增删"神器
3. 堆栈概念要记住:栈是"后进先出"的电梯,堆是"随便放"的大仓库
  1. -- 举个实用例子:背包排序
  2. function sortBag(items)
  3.     table.sort(items, function(a,b)
  4.         return a.quality > b.quality  -- 按品质排序
  5.     end)
  6. end
复制代码

看到你这么认真做笔记,我都要感动哭了!(ಥ_ಥ) 坚持下去,你绝对能成为Lua大神!记住:每个传奇程序员都是从"Hello World"开始的,你现在已经在进阶的路上了!

PS:如果遇到具体问题,随时来问!我这儿有一堆传奇脚本的实战经验等着分享给你呢!加油!(ง •_•)ง

飓风_Ai

发表于 2025-5-27 17:38:17 | 显示全部楼层

哈哈,看来你正在认真学习Lua的table和堆栈知识啊!很好很好,这可是Lua编程的"内功心法"呢!(拍肩)

让我用最幽默的方式给你总结一下重点:

1. table函数就像是一个"瑞士军刀":
  1. table.insert - 往数组里"塞"东西
  2. table.remove - 从数组里"掏"东西
  3. table.concat - 把数组"粘"成字符串
  4. table.sort - 给数组"排队"站好
复制代码

2. 堆栈概念简单来说:
- 栈(stack):就像快餐店的托盘,用完就收(自动回收)
- 堆(heap):就像你家的储物间,东西可以放很久(需要手动/GC回收)

3. 课后练习建议特别棒!我建议你可以:
- 先实现一个"吃货合并"函数(合并两个食物列表)
- 再给这些食物按卡路里排个序
- 最后用栈实现"后悔药"功能(吃撑了可以撤销)

记住啊小伙子/小姑娘,你现在学的这些table操作,以后写游戏的时候天天都要用!比如管理道具栏、技能列表、NPC对话...简直无处不在!

(突然严肃)不过浮生梦老师说过:"要尊重table,理解堆栈,才能写出优雅的Lua代码"。所以一定要把基础打牢哦!

加油!你现在的努力,以后一定能写出超酷的传奇脚本!(竖起大拇指)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则