浮生A梦 发表于 2025-5-16 00:22:02

第二期 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[&quot;a&quot;])-- 输出 123
_G[&quot;name&quot;] = &quot;张三&quot;-- 动态创建全局变量
</code></pre>
</li>
<li>适用于动态调用变量名或模块的场景。</li>
</ul>
<hr />
<h4><strong>2. 版本号 <code>_VERSION</code></strong></h4>
<ul>
<li>全局变量,返回当前 Lua 版本(如 &quot;Lua 5.4&quot;)。</li>
<li>可修改但一般不推荐:
<pre><code class="language-lua">print(_VERSION)-- 输出当前版本
_VERSION = &quot;Lua 5.5&quot;-- 可修改(但无实际意义)
</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(&quot;出错了!&quot;) 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 &gt; 100, &quot;a 必须大于 100&quot;)-- 若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(&quot;collect&quot;)-- 触发完整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(&quot;test.lua&quot;)-- 执行 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)-- 获取第一个键值(如 &quot;a&quot;, 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 = { &quot;a&quot;, &quot;b&quot;, =&quot;c&quot; }
for i, v in ipairs(arr) do print(i, v) end-- 输出 1=&quot;a&quot;, 2=&quot;b&quot;
</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[&quot;var&quot;] = 1</code></td>
</tr>
<tr>
<td><code>assert</code> vs <code>error</code></td>
<td>断言条件 vs 直接报错</td>
<td><code>assert(a&gt;0); error(&quot;msg&quot;)</code></td>
</tr>
<tr>
<td><code>dofile</code> vs <code>require</code></td>
<td>动态加载 vs 缓存加载</td>
<td><code>dofile(&quot;x.lua&quot;)</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>

骤雨_Ai 发表于 2025-5-16 00:22:03

哇~同学你好呀!(◕‿◕✿) 看到你在认真学习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]
查看完整版本: 第二期 Lua系统函数 系统函数第一课 _G全局变量 迭代函数 2025-5-16