第九章:标准库

Lua 为了保持轻量级,核心语言非常小。但它提供了一组实用的标准库,涵盖了常用的功能。这些库由 C 语言实现,效率极高。

前面几章我们已经介绍了 string, table, io, debug 库。本章将重点介绍 math (数学) 和 os (操作系统) 库。

9.1 数学库 (math)

math 库包含了常用的数学函数。

常用三角函数

  • math.sin(x), math.cos(x), math.tan(x): 参数 x 为弧度。

  • math.deg(x): 弧度转角度。

  • math.rad(x): 角度转弧度。

print(math.sin(math.pi / 2)) -- 1.0
print(math.deg(math.pi))     -- 180.0

取整与绝对值

  • math.floor(x): 向下取整。

  • math.ceil(x): 向上取整。

  • math.abs(x): 绝对值。

  • math.fmod(x, y): 取模(浮点数)。

print(math.floor(3.7)) -- 3
print(math.ceil(3.2))  -- 4

随机数

  • math.random(): 返回 [0, 1) 之间的伪随机浮点数。

  • math.random(n): 返回 [1, n] 之间的伪随机整数。

  • math.random(m, n): 返回 [m, n] 之间的伪随机整数。

  • math.randomseed(x): 设置随机数种子。重要:通常在程序开始时使用 os.time() 作为种子,否则每次运行产生的随机序列都一样。

math.randomseed(os.time())
print(math.random(1, 100))

其他

  • math.min(x, ...): 最小值。

  • math.max(x, ...): 最大值。

  • math.sqrt(x): 平方根。

  • math.exp(x): e 的 x 次幂。

  • math.log(x): 自然对数。

  • math.huge: 表示无穷大。

9.2 操作系统库 (os)

os 库提供了与操作系统交互的功能,如日期时间、文件系统操作等。

日期和时间

  • os.time([table]): 返回当前时间戳(秒数)。如果传入表,则返回该表描述的时间的时间戳。

  • os.date([format [, time]]): 格式化时间。

    • %Y: 年 (2026)
    • %m: 月 (02)
    • %d: 日 (15)
    • %H: 时 (24小时制)
    • %M: 分
    • %S: 秒
    • *t: 返回一个包含 year, month, day, hour, min, sec, wday (星期几), yday (一年中的第几天), isdst (夏令时) 的表。
print(os.time()) -- 1771234567

local t = os.date("*t")
print(t.year, t.month, t.day)

print(os.date("%Y-%m-%d %H:%M:%S")) -- 2026-02-15 12:00:00

进程控制

  • os.execute([command]): 执行系统命令。等同于 C 语言的 system

  • os.exit([code]): 终止程序执行。

  • os.getenv(varname): 获取环境变量的值。

os.execute("ls -la") -- 列出当前目录文件
print(os.getenv("HOME")) -- 打印用户主目录

文件系统操作

  • os.remove(filename): 删除文件。

  • os.rename(oldname, newname): 重命名文件。

  • os.tmpname(): 返回一个可用于临时文件的文件名(并不创建文件)。

os.remove("junk.txt")

性能计时

  • os.clock(): 返回程序使用的 CPU 时间(秒)。常用于性能测试。

local start = os.clock()
local s = 0
for i = 1, 1000000 do s = s + i end
print("Elapsed time: " .. os.clock() - start)

练习题

  1. 编写一个函数 get_random_string(len),生成一个指定长度的随机字符串(包含字母和数字)。

  2. 编写一个函数,计算两个日期之间相差的天数。提示:使用 os.time 获取时间戳相减。

  3. 使用 math 库实现一个简单的蒙特卡洛算法来估算圆周率 Pi 的值。

  4. 编写一个脚本,每天凌晨 0 点自动备份某个文件(通过 os.date 检查时间,配合 os.execute 执行复制命令,注意:这通常在系统 cron 中做,但用 Lua 练习一下逻辑)。


下一章预告:Lua 最强大的功能之一是与 C 语言的互操作性。下一章我们将揭开 Lua C API 的神秘面纱,学习如何在 Lua 中调用 C 函数,以及如何在 C 程序中嵌入 Lua。