本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十一课 系统函数 第一节」,主讲:浮生梦。 课程体系:996 引擎传奇开发教学 · 威海旷世互娱教学基地
_G 是 Lua 的全局变量,存储了整个 Lua 运行环境的全部全局内容。它是一个 table 类型,里面包含了所有预定义的函数和你自己定义的全局变量。
核心理解:当你在代码中写 name = "张三" 时,这个变量实际上被存入了 _G 表中。你可以通过 _G.name 来访问它,也可以直接用 name 访问,两者是等价的。
动态变量创建技巧:利用 _G 可以动态生成变量名。例如循环创建 name1、name2...name100 这样的变量,普通写法无法实现,但通过 _G["name" .. i] = 值 就可以做到。
练习题:
-- 练习1:使用 _G 动态创建 10 个变量,名为 var1 到 var10,值分别为 10 到 100
-- 练习2:打印 _G 表中所有的键名,只打印前 5 个
_VERSION 用于获取当前 Lua 解释器的版本号,返回值是字符串如 "Lua 5.1"。
实际用途:在需要兼容不同 Lua 版本的代码中,可以通过判断版本号来执行不同的逻辑分支。例如 5.1 和 5.3 某些 API 有差异,可以用版本判断来分别处理。
练习题:
-- 练习:判断当前版本如果是 5.1 则打印"使用旧版接口",如果是 5.3 则打印"使用新版接口"
error 函数用于手动抛出错误并终止程序运行。它接收两个参数:错误信息字符串和可选的层级数字。
层级参数说明:默认层级为 1,表示错误定位在当前位置。设为 2 时,错误信息会指向调用当前函数的上一层位置,用于调试时追踪错误来源。
重要提醒:error 是调试工具,不是给用户看的提示。在实际运行环境中不要用 error 做业务逻辑判断,否则用户会看到报错而不是友好提示。
练习题:
-- 练习1:写一个函数,当传入的参数小于 0 时,用 error 抛出"参数不能为负数"
-- 练习2:测试 level 参数为 1 和 2 时,错误提示的行号有什么不同
assert 是简化版的条件判断工具。它接收两个参数:判断条件和错误信息。如果条件为假(false 或 nil),就抛出错误信息;如果为真,则什么都不发生继续执行。
与 if 的区别:assert 用于开发阶段确保某些条件一定成立,不是用来替代 if 做业务分支的。代码中大量使用 assert 会让其他开发者困惑。
练习题:
-- 练习1:用 assert 判断一个变量是否为数字类型,如果不是则提示"需要数字类型"
-- 练习2:结合 tonumber,先转换再 assert 判断转换是否成功
dofile 用于加载并执行外部 Lua 文件。每次调用都会重新读取文件并执行,不做缓存。
与 require 的区别:require 只加载一次并缓存结果,dofile 每次都重新加载。高频调用 dofile 会消耗大量内存,适合用在需要动态更新脚本内容的场景。
练习题:
-- 练习1:创建一个 test.lua 文件,里面写 print("文件已加载"),然后用 dofile 执行它
-- 练习2:修改 test.lua 内容,再次 dofile,观察是否执行了新内容
load 函数将字符串转换为可执行的函数。它不会立即执行,而是返回一个函数对象,你需要再调用这个函数才会执行。
安全警告:永远不要直接 load 用户输入的字符串,这会导致严重的安全漏洞。load 只用于加载你自己生成的、可信的代码片段。
loadfile 是 load 的文件版:它从文件读取内容再 load,同样是返回函数对象而非直接执行。
练习题:
-- 练习1:用 load 将字符串 "return 1+1" 转为函数并执行,打印结果
-- 练习2:用 load 执行多行代码字符串,包含变量赋值和打印
select 专门用于处理可变参数函数(...)。它有两种用法:
井号用法:select("#", ...) 返回可变参数的总个数
索引用法:select(n, ...) 返回从第 n 个参数开始的所有参数
负索引:select(-1, ...) 返回最后一个参数
练习题:
-- 练习1:写一个函数接收任意数量参数,用 select("#") 打印参数总数
-- 练习2:用 select(2, ...) 获取从第2个参数开始的所有值
-- 练习3:用 select(-1, ...) 获取最后一个参数的值
tonumber 将字符串转为数字,转换失败返回 nil。tostring 将任意类型转为字符串表示。
性能提示:数字类型的运算速度比字符串快,虽然现代硬件差距很小,但在大量数据处理时仍建议优先使用数字类型。
转换技巧:字符串转数字除了 tonumber,还可以用 "123" * 1 这种数学运算强制转换,Lua 会自动处理。
练习题:
-- 练习1:将字符串 "100" 转为数字,然后判断其是否大于 50
-- 练习2:尝试将 "abc" 转为数字,用 assert 判断转换是否成功
-- 练习3:用 .. 连接符和 tostring 两种方式,将数字 100 转为字符串
pcall(protected call)保护模式调用函数。它执行目标函数,如果出错不会中断程序,而是返回 false 和错误信息;如果成功返回 true 和函数返回值。
返回值:第一个值是布尔状态(成功 true / 失败 false),第二个值是错误信息或正常返回值。
xpcall 增强版:比 pcall 多一个错误处理函数参数。当目标函数出错时,会自动调用这个错误处理函数,你可以在里面记录日志或做清理工作。
应用场景:调用不确定是否稳定的函数(如用户提供的回调、网络请求结果处理)时使用,确保一个函数的错误不会导致整个程序崩溃。
练习题:
-- 练习1:用 pcall 调用一个会出错的函数,根据返回值判断成功或失败
-- 练习2:用 xpcall 调用出错函数,并指定一个错误处理函数打印"已捕获错误"
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十一课 系统函数 第一节」,主讲:浮生梦。 课程体系:996…
本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第九课 后端面向对象和事件推送」,主讲:浮生梦。 课程体系:9…
本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十课 后端面向对象 class构造」,主讲:浮生梦。 课程体…
代码不说话, 让它自己说 。 print 是 Lua 战士的第一件武器——用好它,八成的 bug 不用看第二眼。 <styl…
新手爱问「我怎么知道玩家上线了」—— 你不用知道,框架会喊你 。轮询是你去问,事件是它来叫:理解事件推送,才算入了框架的门。…
框架给你几百个接口, 本质都是同一件事:参数进去,结果出来 。把「调用约定」刻进肌肉,说明书再厚也不慌。 <style .i…