Lua学习记录(4) --- Lua中多文件调用 以及 关于位运算符的零碎知识点

目录

一、Lua中的跨文件调用

二、判断脚本是否被加载了

三、一些零碎知识

1、_G表

2、多返回值和接收参数关系

[3、and or 的短路运算](#3、and or 的短路运算)

4、lua中的垃圾回收

5、lua的自带库介绍

(1)basic(基础库)

(2)string(字符串库)文章末尾是字符串库的讲解

(3)table(表库)表的介绍

(4)math(数学库)

[(5)coroutine(协程库)这个后面单独用一篇文章介绍 这里先不管](#(5)coroutine(协程库)这个后面单独用一篇文章介绍 这里先不管)

(6)os(操作系统库)



一、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中的面向对象!

相关推荐
yaoxin5211231 小时前
256. Java 集合 - 掌握 Java 的 merge () 方法:提升 Map 操作效率与灵活性的关键
java·开发语言
woodykissme1 小时前
齿轮如何撬动工业文明的进程
学习·机械·齿轮·传动
AuroraWanderll1 小时前
深入理解C++多态(三):多态的原理——虚函数表机制(上)
c语言·开发语言·数据结构·c++·算法·stl
lly2024061 小时前
Python Number(数字)
开发语言
阿沁QWQ1 小时前
STL库vector模拟实现
开发语言·c++
码界奇点1 小时前
Java大数据在智能教育个性化学习资源推荐中的冷启动解决方案
java·大数据·学习·动画·推荐算法
未来之窗软件服务1 小时前
操作系统应用(三十二)python版本选择系统—东方仙盟筑基期
开发语言·python·东方仙盟·操作系统应用
Ustinian_3101 小时前
【python】图片转PDF工具【附完整源码】
开发语言·python·pdf