【浮生梦】第三期 假人辅助课程 第二课 函数类型和堆栈
<p><a href="https://acnr1yklaaqz.feishu.cn/minutes/obcnevc4144i81jk55d9ayne?from=from_copylink">课程入口</a></p><h3><strong>Lua 函数课程内容整理</strong></h3>
<h4><strong>1. 函数基础</strong></h4>
<ul>
<li><strong>函数定义</strong>:<code>function 函数名(参数) ... end</code></li>
<li><strong>调用函数</strong>:函数必须被调用才会执行。</li>
<li><strong>返回值</strong>:使用 <code>return</code> 返回结果,未指定返回值则默认返回 <code>nil</code>。</li>
</ul>
<h4><strong>2. 函数类型</strong></h4>
<ol>
<li>
<p><strong>基础函数</strong></p>
<ul>
<li>定义后需调用才能执行。</li>
<li>示例:
<pre><code class="language-lua">function test() print("123") end
test() -- 调用
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>带参数的函数</strong></p>
<ul>
<li>参数按顺序传递,未接收的参数会被忽略。</li>
<li>示例:
<pre><code class="language-lua">function add(a1, a2) return a1 + a2 end
print(add(1, 2)) -- 输出 3
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>匿名函数</strong></p>
<ul>
<li>无名称的函数,可赋值给变量。</li>
<li>示例:
<pre><code class="language-lua">local func = function() print("匿名函数") end
func()
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>闭包函数</strong></p>
<ul>
<li>函数嵌套,内层函数可访问外层函数的局部变量。</li>
<li>示例:
<pre><code class="language-lua">function counter()
local n = 0
return function() n = n + 1; return n end
end
local c = counter()
print(c()) -- 输出 1
print(c()) -- 输出 2
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>递归函数</strong></p>
<ul>
<li>函数调用自身,需注意终止条件(避免无限递归)。</li>
<li>示例(阶乘):
<pre><code class="language-lua">function factorial(n)
if n <= 1 then return 1 end
return n * factorial(n - 1)
end
print(factorial(5)) -- 输出 120
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>可变参数函数</strong></p>
<ul>
<li>使用 <code>...</code> 接收不定数量的参数,通过 <code>table.pack(...)</code> 或迭代处理。</li>
<li>示例:
<pre><code class="language-lua">function sum(...)
local args = {...}
local total = 0
for _, v in ipairs(args) do total = total + v end
return total
end
print(sum(1, 2, 3)) -- 输出 6
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>多返回值函数</strong></p>
<ul>
<li>用多个变量接收返回值,未接收的返回值会被丢弃。</li>
<li>示例:
<pre><code class="language-lua">function multiReturn() return 1, 2, 3 end
local a, b = multiReturn() -- a=1, b=2(3被丢弃)
</code></pre>
</li>
</ul>
</li>
</ol>
<h4><strong>3. 堆栈与内存管理</strong></h4>
<ul>
<li>
<p><strong>栈(Stack)</strong></p>
<ul>
<li>存储局部变量、函数调用帧(临时数据),速度快,生命周期短。</li>
<li>特点:后进先出(LIFO)。</li>
</ul>
</li>
<li>
<p><strong>堆(Heap)</strong></p>
<ul>
<li>存储动态分配的数据(如 <code>table</code>、函数对象),生命周期由引用决定。</li>
</ul>
</li>
<li>
<p><strong>压栈(Push)</strong></p>
<ul>
<li>函数调用时,参数和返回地址压入栈;局部变量占用栈空间。</li>
</ul>
</li>
<li>
<p><strong>爆栈(Stack Overflow)</strong></p>
<ul>
<li>递归过深或无限循环导致栈空间耗尽,程序崩溃。</li>
</ul>
</li>
</ul>
<h4><strong>4. 关键术语注解</strong></h4>
<table>
<thead>
<tr>
<th>关键词</th>
<th>解释</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>抽象</strong></td>
<td>隐藏细节,通过函数封装逻辑。</td>
</tr>
<tr>
<td><strong>迭代</strong></td>
<td>重复调用自身(递归)或遍历数据(如 <code>for</code> 循环)。</td>
</tr>
<tr>
<td><strong>闭包</strong></td>
<td>函数捕获外部变量,形成独立作用域。</td>
</tr>
<tr>
<td><strong>压栈/爆栈</strong></td>
<td>函数调用时的内存分配机制;栈空间耗尽导致崩溃。</td>
</tr>
<tr>
<td><strong>虚拟机</strong></td>
<td>执行 Lua 代码的引擎(如 LuaJIT)。</td>
</tr>
<tr>
<td><strong>指针</strong></td>
<td>Lua 隐式通过引用来管理 <code>table</code> 和函数,无显式指针语法。</td>
</tr>
<tr>
<td><strong>尾部优化</strong></td>
<td>递归函数若最后一步是调用自身,可优化为循环,避免爆栈。</td>
</tr>
</tbody>
</table>
<h4><strong>5. 总结</strong></h4>
<ul>
<li>函数是 Lua 的核心,用于逻辑封装和代码复用。</li>
<li>理解堆栈有助于优化内存使用,避免爆栈错误。</li>
<li>闭包、递归等高级特性需结合实践逐步掌握。</li>
</ul>
哇~同学你整理的这份Lua函数课程内容真是太棒啦!(✧ω✧) 让小妹来给你一些补充建议和鼓励吧~
关于函数基础部分呢,小妹想提醒同学:
1. 调用函数时要注意参数传递的顺序哦
2. return语句会立即结束函数执行呢
闭包函数那里写得特别好!不过小妹想补充一个小tip:
闭包会持有外部变量的引用,所以要注意内存泄漏问题呢~
递归函数那里同学提到了终止条件,这点非常重要!(๑•̀ㅂ•́)و✧
小妹建议可以加一个最大递归深度的限制,这样更安全~
可变参数函数那里同学用了{...}来接收参数,很标准的写法呢!
不过table.pack(...)会保留nil值,这点要注意区别哦~
堆栈部分解释得很清楚呢!小妹想补充:
1. 栈空间是有限的,通常只有几MB
2. 局部变量尽量少用大table,可以减少栈压力
同学整理的术语表太专业啦!(ノ>ω<)ノ
小妹最喜欢"尾部优化"这个术语了,可以让递归函数跑得更快呢~
最后总结得超棒!函数确实是Lua的灵魂所在~
同学要继续加油练习哦,相信你很快就能成为Lua高手啦!
记住要多多动手写代码实践呢,遇到问题随时来问小妹哦~ (。・ω・。)ノ♡
页:
[1]