目录
[3、and or 的短路运算](#3、and or 的短路运算)
[(5)coroutine(协程库)这个后面单独用一篇文章介绍 这里先不管](#(5)coroutine(协程库)这个后面单独用一篇文章介绍 这里先不管)
一、Lua中的跨文件调用
很简单,请记住一个关键字 require("lua文件名") 或 require "lua文件名",这样就实现了在一个文件中 执行多个lua文件 他会返回一个表 这个表我们就可以用来调用 被加载的文件内部的函数 或者变量
举个栗子🌰!假如你的 a.lua文件中 有一个 add()的方法 或者 money的全局变量(没有用 local修饰的变量就是全局变量 默认写的不加修饰符的变量就是全局变量)那么你在同一目录下的其他lua文件中 如果想要获取到 a.lua文件中的这些内容 你就可以通过 require的方式进行加载了!
务必注意!是不能访问被加载文件中的本地变量(加了local的)的!
上面就是加载 你想要的文件 那么卸载呢 就是你不想要了 简单将你加载的表存下来 然后置空就完了 不过一般不会这样使用
例如:
Lua
-- 多脚本执行
-- 就是一个关键字而已 require 有两个用法 一个是加载脚本文件 一个就是获取加载的脚本文件的返回值 一般返回局部变量
-- require("脚本名") 脚本名就是不带后缀名的脚本文件
-- 单引号 或者 双引号 都可以 其实这样加载 就是执行了整个脚本文件
ret = require("Test") -- 脚本加载
-- require 执行一个脚本时 可以获取执行脚本想要返回的某个值
-- 我们就可以通过一个变量来接收这个返回值
print("Test脚本返回值是" .. ret)
print("testA的值是" .. testA)
-- print("testB的值是" .. testB) -- 报错 访问不到 本地变量
二、判断脚本是否被加载了
很简单 就一句代码package.loaded["脚本名"] 会返回一个bool值
三、一些零碎知识
1、_G表
_G表 是一个总表 他将我们申明的所有的全局变量都存储在其中 请注意是全局变量 而不是局部变量 既然是表就可以访问 正常将其当做一个表就行 这个在后面会有用 我忘记在哪里了 后面记录的时候再看
Lua
for k, v in pairs(_G) do -- 直接访问即可
print(k,v)
end
2、多返回值和接收参数关系
lua很厉害 如果lua的函数返回很多返回值 但你用于接收的变量数目不足的话 他也不会报错 就是返回值收不到了嘛
如果你用于接收的返回值变量数目较多的话 就是多于 lua函数的返回值数目的话 也没关系 只是多于的变量为nil 就没意义嘛
3、and or 的短路运算
在lua中也是支持短路运算的 (前面条件) and (后面条件)就是前面如果为假 后面条件就不会走了 ; (前面条件)or (后面条件)就是如果前面条件是真的话 不会走后面的条件语句了
于是乎 便有:
-- and or 逻辑运算符 不经可以连接boolean值 还可以连接任意类型的值
-- 在lua中 只有nil和false是false 其他都是true
-- 短路 对于and 来说 有假则假 对于or来说 有真则真
-- 所以 他们只需要判断 第一个是否满足 就会停止计算了
-- and 运算符 会返回第一个为false的值 如果都为true 则返回最后一个值
Lua
print("and 运算符")
print("结果是"..tostring( true and 123 )) -- true and 123 结果是123
print("结果是"..tostring( false and 123 )) -- false and 123 结果是false
print("结果是"..tostring( nil and 123 )) -- nil and 123 结果是nil
print("结果是"..tostring( 0 and 123 )) -- 0 and 123 结果是123
print("结果是"..tostring( "hello" and 123 )) -- "hello" and 123 结果是123
-- or 运算符 会返回第一个为true的值 如果都为false 则返回最后一个值
print("or 运算符")
print("结果是"..tostring( true or 123 )) -- true or 123 结果是true
print("结果是"..tostring( false or 123 )) -- false or 123 结果是123
print("结果是"..tostring( nil or 123 )) -- nil or 123 结果是123
print("结果是"..tostring( 0 or 123 )) -- 0 or 123 结果是0
print("结果是"..tostring( "hello" or 123 )) -- "hello" or 123 结果是hello
所以利用这个特性 可以实现三目运算符:
Lua
-- lua中的 and or 逻辑运算符 还可以用来实现 三元运算符
x ,y = 10,20
max = (x > y) and x or y
print("max="..max)
-- and是有假则假 所以要看后面 or 是有真则真 所以如果前面为真 则会被and返回 最后or不会被执行
-- 如果前面为假 则会被and返回 最后or会被执行 返回or的值
4、lua中的垃圾回收
Lua 的垃圾回收器(GC)是一个自动内存管理系统,负责跟踪并回收程序不再使用的对象(表、闭包、userdata、线程等),避免手动释放带来的复杂度。所以说我们基本可以不用关心他的内部是怎么做的,了解即可
这里简单介绍两个简单的API 一个是显示 lua当前占用的内存 一个是调用垃圾回收
Lua
-- collectgarbage
-- 获取当前lua占用内存数 K字节 用返回值 * 1024 就可以获得具体的内存占用
print(collectgarbage("count") )
-- lua中的垃圾回收和C#中的垃圾回收机制很类似 解除引用就是垃圾了
-- 进行垃圾回收 理解有一点像C#中的 GC
collectgarbage("collect")
5、lua的自带库介绍
Lua 自带库相当于一套"标准工具箱",不需要额外安装即可在任意 Lua 环境中使用,涵盖常见的数学、字符串、表操作、I/O 等功能。前面提到的table其实也是库,里面是不是提供了很多很多的方法供你使用嘛。还有那个string也是 里面提供了一些字符串操作方法,下面主要对还未出现的库进行重点介绍。主要模块如下:
(1)basic(基础库)
Lua 自动加载,提供诸如 print、type、pairs/ipairs、tonumber、tostring、pcall/xpcall、require 等核心函数。还包含模块系统的基本支持(package 表中记录搜索路径、已加载模块等)。
(2)string(字符串库)文章末尾是字符串库的讲解
包含 string.format, string.find, string.match, string.gsub, string.sub, string.upper/lower, string.rep 等,用于格式化、查找、模式匹配(Lua 自有的简化正则)等。也支持使用冒号语法 s:sub(1,3) 的面向对象调用。
(3)table(表库)表的介绍
针对数组部分的常用操作:table.insert, table.remove, table.concat, table.sort, table.move, table.unpack 等,有助于管理列表、栈、队列。注意这些函数默认操作"数组段"(整数键 1..n),对字典部分不会自动处理。
(4)math(数学库)
包含 math.floor, math.ceil, math.max/min, math.abs, math.random, math.randomseed, math.sin/cos/tan, math.log, math.exp, math.pi 等。
Lua
-- 数学计算
print(math.abs(-111))
-- 弧度转角度
print(math.deg(math.pi))
-- 三角函数
print(math.cos(math.pi))
-- 向下取整
print(math.floor(2.6)) -- 2
-- 向上取整
print(math.ceil(2.2)) -- 3
-- 最大最小值
print(math.min(1,2))
print(math.max(5,111))
-- 小数分离 分成整数部分和小数部分
print(math.modf(5.1)) -- 5 0.1
-- 幂运算
print(math.pow(2,5)) -- 2 ^ 5 = 32
-- 随机数
-- 需要先设置随机数种子
math.randomseed(os.time())
print(math.random(999))
print(math.random(999))
-- 开方
print(math.sqrt(4))
(5)coroutine(协程库)这个后面单独用一篇文章介绍 这里先不管
支撑 Lua 原生协程:coroutine.create, coroutine.resume, coroutine.yield, coroutine.wrap, coroutine.running, coroutine.isyieldable.让你编写类似协程/协作式多任务的逻辑,常用于游戏脚本、状态机。
(6)os(操作系统库)
提供与宿主系统的简单交互,如 os.time, os.date, os.difftime, os.execute, os.remove, os.rename, os.getenv, os.clock. 主要用于时间、文件名、运行外部命令等。
| 函数 | 作用 | 示例输出 | 说明 |
|---|---|---|---|
| os.time([table]) | 获取当前或指定日期的 Unix 时间戳 | 当前时间戳: 1732954800<br>跨年时间戳: 1767139140 | 数值随实际时间变化,可用于保存、比较时间点 |
| os.date([format [, time]]) | 将时间戳格式化为字符串或表 | 当前日期: 2025-11-30 21:13:05<br>今天是 2025 年第 334 天 | format 支持标准占位符;*t 返回包含 year/month/day/yday 的表 |
| os.difftime(t2, t1) | 计算两个时间戳的时间差(秒) | 离跨年还剩: 34184340 秒 | 结果为 t2 - t1,可做倒计时或耗时统计 |
| os.clock() | 返回当前 Lua 进程占用的 CPU 时间 | 循环耗时: 0.0156 秒 | 适合微基准测试,表示代码块消耗的 CPU 秒数 |
| os.getenv(var) | 读取环境变量值 | PATH 环境变量片段: C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem... | 若变量不存在返回 nil,示例截取前 60 个字符方便展示 |
| os.execute(cmd) | 调用系统命令并返回状态 | 命令结果: true exit 0 | Windows 下执行 dir 成功返回 true 和退出码 0;失败会得到 false 及错误信息 |
| os.rename(old, new)<br>os.remove(path) | 重命名或删除文件/目录 | os.rename("demo.txt","demo_renamed.txt") -> true<br>os.remove("demo_renamed.txt") -> true | 成功返回 true,若目标不存在会抛错,建议用 pcall 包裹防止脚本中断 |
Lua
print("=== os 库演示 ===")
local now = os.time()
local target = os.time({year = 2025, month = 12, day = 31, hour = 23, min = 59})
print("当前时间戳:", now)
print("跨年时间戳:", target)
print("当前日期:", os.date("%Y-%m-%d %H:%M:%S", now))
local dateTable = os.date("*t", now)
print(("今天是 %d 年第 %d 天"):format(dateTable.year, dateTable.yday))
print("离跨年还剩:", os.difftime(target, now), "秒")
local start = os.clock()
for i = 1, 1e5 do local _ = math.sqrt(i) end
print("循环耗时:", os.clock() - start, "秒")
print("PATH 环境变量片段:", (os.getenv("PATH") or "nil"):sub(1, 60) .. "...")
-- os.rename("demo.txt", "demo_renamed.txt")
-- os.remove("demo_renamed.txt")
-- local ok, reason, code = os.execute("dir")
-- print("命令结果:", ok, reason, code)

值得注意的是 这个时间也是一个表 我们可以在内部获取到对应的信息 如此获取

好的 今天的深夜文章 就到此结束咯 下一篇我们将进入lua中的面向对象!