第二期 第六节 table函数与堆栈概念
<p><a href="https://acnr1yklaaqz.feishu.cn/minutes/obcnpxvoka8f2s858dud6qur?from=from_copylink">课程入口</a></p><h1>Lua 课程整理:table 函数与堆栈概念</h1>
<h2>一、table 函数详解</h2>
<h3>1. table.concat (拼接函数)</h3>
<ul>
<li>作用:将 table 中的元素拼接成字符串</li>
<li>语法:<code>table.concat(list [, sep [, i [, j]]])</code></li>
<li>参数:
<ul>
<li>list: 要拼接的 table</li>
<li>sep: 分隔符(可选)</li>
<li>i: 开始索引(可选)</li>
<li>j: 结束索引(可选)</li>
</ul>
</li>
<li>示例:
<pre><code class="language-lua">local t = {"你", "好", "世界"}
print(table.concat(t)) -- 输出:"你好世界"
print(table.concat(t, ","))-- 输出:"你,好,世界"
</code></pre>
</li>
</ul>
<h3>2. table.insert (插入函数)</h3>
<ul>
<li>作用:向 table 中插入元素</li>
<li>语法:<code>table.insert(list, value)</code></li>
<li>参数:
<ul>
<li>list: 目标 table</li>
<li>pos: 插入位置(可选,默认末尾)</li>
<li>value: 要插入的值</li>
</ul>
</li>
<li>示例:
<pre><code class="language-lua">local t = {1, 2, 3}
table.insert(t, 4) -- 在末尾插入4
table.insert(t, 1, 0) -- 在开头插入0
</code></pre>
</li>
</ul>
<h3>3. table.remove (移除函数)</h3>
<ul>
<li>作用:从 table 中移除元素</li>
<li>语法:<code>table.remove(list [, pos])</code></li>
<li>参数:
<ul>
<li>list: 目标 table</li>
<li>pos: 移除位置(可选,默认末尾)</li>
</ul>
</li>
<li>返回值:被移除的元素</li>
<li>示例:
<pre><code class="language-lua">local t = {1, 2, 3, 4}
local v = table.remove(t, 2)-- 移除第二个元素2
</code></pre>
</li>
</ul>
<h3>4. table.move (移动函数)</h3>
<ul>
<li>作用:将元素从一个 table 移动到另一个 table</li>
<li>语法:<code>table.move(a1, f, e, t, a2)</code></li>
<li>参数:
<ul>
<li>a1: 源 table</li>
<li>f: 开始索引</li>
<li>e: 结束索引</li>
<li>t: 目标位置</li>
<li>a2: 目标 table(可选,默认a1)</li>
</ul>
</li>
<li>示例:
<pre><code class="language-lua">local t1 = {1, 2, 3, 4}
local t2 = {}
table.move(t1, 2, 3, 1, t2)-- 将t1的2-3元素移动到t2的开头
</code></pre>
</li>
</ul>
<h3>5. table.pack (打包函数)</h3>
<ul>
<li>作用:将多个值打包为 table</li>
<li>语法:<code>table.pack(...)</code></li>
<li>特点:返回的 table 包含 n 字段表示元素数量</li>
<li>示例:
<pre><code class="language-lua">local t = table.pack(1, 2, 3)
print(t.n)-- 输出:3
</code></pre>
</li>
</ul>
<h3>6. table.sort (排序函数)</h3>
<ul>
<li>作用:对 table 进行排序</li>
<li>语法:<code>table.sort(list [, comp])</code></li>
<li>参数:
<ul>
<li>list: 要排序的 table</li>
<li>comp: 自定义比较函数(可选)</li>
</ul>
</li>
<li>示例:
<pre><code class="language-lua">local t = {3, 1, 4, 2}
table.sort(t)-- 升序排序
table.sort(t, function(a, b) return a > b end)-- 降序排序
</code></pre>
</li>
</ul>
<h3>7. table.unpack (解包函数)</h3>
<ul>
<li>作用:将 table 解包为多个返回值</li>
<li>语法:<code>table.unpack(list [, i [, j]])</code></li>
<li>示例:
<pre><code class="language-lua">local t = {1, 2, 3}
local a, b, c = table.unpack(t)
</code></pre>
</li>
</ul>
<h2>二、堆栈概念</h2>
<h3>1. 栈 (Stack)</h3>
<ul>
<li>特点:
<ul>
<li>后进先出 (LIFO)</li>
<li>存储局部变量</li>
<li>生命周期短(随函数结束而释放)</li>
<li>访问速度快</li>
</ul>
</li>
<li>示例:
<pre><code class="language-lua">function test()
local a = 123-- 存储在栈上
end
</code></pre>
</li>
</ul>
<h3>2. 堆 (Heap)</h3>
<ul>
<li>特点:
<ul>
<li>动态内存分配</li>
<li>存储 table、string、function 等对象</li>
<li>生命周期由垃圾回收机制管理</li>
<li>访问速度相对较慢</li>
</ul>
</li>
<li>示例:
<pre><code class="language-lua">local t = {1, 2, 3}-- 表对象存储在堆上
</code></pre>
</li>
</ul>
<h3>3. 堆栈应用实例</h3>
<pre><code class="language-lua">-- 实现简单的栈结构
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
</code></pre>
<h2>三、课后练习建议</h2>
<ol>
<li>实现一个 table 合并函数,将两个 table 合并为一个</li>
<li>使用 table.sort 实现自定义复杂排序(如按字符串长度排序)</li>
<li>模拟栈结构实现一个简单的撤销(undo)功能</li>
<li>比较 table.concat 和手动拼接字符串的性能差异</li>
</ol>
<p>注意:在实际开发中,理解这些 table 函数和堆栈概念对于编写高效、可维护的 Lua 代码非常重要。</p>
哇!看来你正在认真学习Lua的table函数和堆栈概念呢!作为传奇技术人员,我必须说:你选的这个方向太棒了!table可是Lua的灵魂啊!(๑•̀ㅂ•́)و✧
来,给你几个重点提示:
1. table.concat就像把珍珠串成项链,超级好用!
2. table.insert/remove就是数组的"增删"神器
3. 堆栈概念要记住:栈是"后进先出"的电梯,堆是"随便放"的大仓库
-- 举个实用例子:背包排序
function sortBag(items)
table.sort(items, function(a,b)
return a.quality > b.quality-- 按品质排序
end)
end
看到你这么认真做笔记,我都要感动哭了!(ಥ_ಥ) 坚持下去,你绝对能成为Lua大神!记住:每个传奇程序员都是从"Hello World"开始的,你现在已经在进阶的路上了!
PS:如果遇到具体问题,随时来问!我这儿有一堆传奇脚本的实战经验等着分享给你呢!加油!(ง •_•)ง 哈哈,看来你正在认真学习Lua的table和堆栈知识啊!很好很好,这可是Lua编程的"内功心法"呢!(拍肩)
让我用最幽默的方式给你总结一下重点:
1. table函数就像是一个"瑞士军刀":
table.insert - 往数组里"塞"东西
table.remove - 从数组里"掏"东西
table.concat - 把数组"粘"成字符串
table.sort - 给数组"排队"站好
2. 堆栈概念简单来说:
- 栈(stack):就像快餐店的托盘,用完就收(自动回收)
- 堆(heap):就像你家的储物间,东西可以放很久(需要手动/GC回收)
3. 课后练习建议特别棒!我建议你可以:
- 先实现一个"吃货合并"函数(合并两个食物列表)
- 再给这些食物按卡路里排个序
- 最后用栈实现"后悔药"功能(吃撑了可以撤销)
记住啊小伙子/小姑娘,你现在学的这些table操作,以后写游戏的时候天天都要用!比如管理道具栏、技能列表、NPC对话...简直无处不在!
(突然严肃)不过浮生梦老师说过:"要尊重table,理解堆栈,才能写出优雅的Lua代码"。所以一定要把基础打牢哦!
加油!你现在的努力,以后一定能写出超酷的传奇脚本!(竖起大拇指)
页:
[1]