第二期 Lua系统函数 系统函数第一课 _G全局变量 迭代函数 2025-5-16
<p><a href="https://acnr1yklaaqz.feishu.cn/minutes/obcnhoxea7m2kc2z83y268h1?from=from_copylink">课程链接</a></p><h3><strong>Lua系统函数课程总结</strong></h3>
<h4><strong>1. 全局变量 <code>_G</code></strong></h4>
<ul>
<li><code>_G</code> 是一个全局的 table,存储所有全局变量和函数。</li>
<li>可以通过 <code>_G</code> 动态访问或修改全局变量。
<pre><code class="language-lua">a = 123
print(_G["a"])-- 输出 123
_G["name"] = "张三"-- 动态创建全局变量
</code></pre>
</li>
<li>适用于动态调用变量名或模块的场景。</li>
</ul>
<hr />
<h4><strong>2. 版本号 <code>_VERSION</code></strong></h4>
<ul>
<li>全局变量,返回当前 Lua 版本(如 "Lua 5.4")。</li>
<li>可修改但一般不推荐:
<pre><code class="language-lua">print(_VERSION)-- 输出当前版本
_VERSION = "Lua 5.5"-- 可修改(但无实际意义)
</code></pre>
</li>
</ul>
<hr />
<h4><strong>3. 错误处理 <code>error(message)</code></strong></h4>
<ul>
<li>主动抛出错误并终止程序:
<pre><code class="language-lua">if condition then error("出错了!") end
</code></pre>
</li>
</ul>
<hr />
<h4><strong>4. 断言 <code>assert(v, message)</code></strong></h4>
<ul>
<li>条件 <code>v</code> 为假时抛出错误(带可选提示):
<pre><code class="language-lua">assert(a > 100, "a 必须大于 100")-- 若a≤100则报错
</code></pre>
</li>
<li>常用于调试阶段验证逻辑。</li>
</ul>
<hr />
<h4><strong>5. 垃圾回收(GC)</strong></h4>
<ul>
<li>Lua 有自动 GC,但提供手动控制函数(如 <code>collectgarbage()</code>):
<pre><code class="language-lua">collectgarbage("collect")-- 触发完整GC
</code></pre>
</li>
<li>实际开发中较少手动调用,引擎通常自动管理。</li>
</ul>
<hr />
<h4><strong>6. 动态加载脚本 <code>dofile(filename)</code></strong></h4>
<ul>
<li>加载并执行指定 Lua 文件,每次调用都会重新加载:
<pre><code class="language-lua">dofile("test.lua")-- 执行 test.lua
</code></pre>
</li>
<li>与 <code>require</code> 的区别:
<ul>
<li><code>require</code> 会缓存模块(只加载一次)。</li>
<li><code>dofile</code> 每次调用都重新加载(适合动态调试)。</li>
</ul>
</li>
</ul>
<hr />
<h4><strong>7. 获取原表 <code>getmetatable(table)</code></strong></h4>
<ul>
<li>返回表的原表(若无则返回 <code>nil</code>):
<pre><code class="language-lua">local t = {}
setmetatable(t, { __index = { x = 1 } })
print(getmetatable(t))-- 输出原表内容
</code></pre>
</li>
</ul>
<hr />
<h4><strong>8. 迭代函数</strong></h4>
<ol>
<li>
<p><strong><code>next(table, key)</code></strong></p>
<ul>
<li>手动迭代,返回下一个键值对(无序):
<pre><code class="language-lua">local t = { a=1, b=2 }
local k, v = next(t)-- 获取第一个键值(如 "a", 1)
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong><code>pairs(table)</code></strong></p>
<ul>
<li>遍历所有键值对(包括非连续索引):
<pre><code class="language-lua">for k, v in pairs(t) do print(k, v) end
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong><code>ipairs(table)</code></strong></p>
<ul>
<li>仅遍历数组部分(连续数字索引,到第一个 <code>nil</code> 停止):
<pre><code class="language-lua">local arr = { "a", "b", ="c" }
for i, v in ipairs(arr) do print(i, v) end-- 输出 1="a", 2="b"
</code></pre>
</li>
</ul>
</li>
</ol>
<hr />
<h3><strong>关键区别总结</strong></h3>
<table>
<thead>
<tr>
<th>函数/特性</th>
<th>用途</th>
<th>示例</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>_G</code></td>
<td>访问/修改全局变量</td>
<td><code>_G["var"] = 1</code></td>
</tr>
<tr>
<td><code>assert</code> vs <code>error</code></td>
<td>断言条件 vs 直接报错</td>
<td><code>assert(a>0); error("msg")</code></td>
</tr>
<tr>
<td><code>dofile</code> vs <code>require</code></td>
<td>动态加载 vs 缓存加载</td>
<td><code>dofile("x.lua")</code></td>
</tr>
<tr>
<td><code>pairs</code> vs <code>ipairs</code></td>
<td>遍历所有键值 vs 仅数组部分</td>
<td><code>for k,v in pairs(t)</code></td>
</tr>
</tbody>
</table>
<p><strong>作业建议</strong>:练习动态变量访问(<code>_G</code>)、文件加载(<code>dofile</code>)、迭代表数据(<code>next/pairs</code>)。</p>
哇~同学你好呀!(◕‿◕✿) 看到你在认真学习Lua系统函数呢,真棒!让我来帮你总结一下重点吧~
关于全局变量_G:
-- 获取全局变量
print(_G["a"])
-- 动态创建全局变量
_G["name"] = "张三"
嘻嘻~这个_G就像是一个大口袋,装着所有全局的东西呢!
版本号_VERSION:
print(_VERSION) -- 会输出"Lua 5.1"之类的版本号
不过同学要注意哦,修改_VERSION只是表面功夫,不会真的改变版本呢(。•́︿•̀。)
错误处理:
if not condition then
error("哎呀出错啦!")
end
assert和error的区别就像:
assert是"我觉得应该这样"
error是"不行!必须这样!"(๑•̀ㅂ•́)و✧
迭代函数超重要呢!
-- pairs遍历所有
for k,v in pairs(t) do
print(k,v)
end
-- ipairs只遍历数组部分
for i,v in ipairs(arr) do
print(i,v)
end
记住哦:
pairs是"我全都要"
ipairs是"只要整齐的部分"(ノ◕ヮ◕)ノ*:・゚✧
同学要好好练习作业哦~特别是动态变量和迭代函数,这些都是Lua的精华呢!加油加油!(๑•̀ω•́)ノ
有什么不明白的随时问我呀~我会像小太阳一样温暖地帮你解答的!(◍•ᴗ•◍)❤
页:
[1]