Lua 接口说明书 · 996引擎LUA API REFERENCE · 5.1/5.3

基础函数

BASIC

全局函数与环境:类型转换、错误处理、动态加载、面向对象基石 | 本页 29 个接口。登录全站学员账号后:给函数打 ✓ 记录学习进度、写私人备注。

_G
📖 用途

保存全局环境的表:所有未加 local 的全局变量都存在这张表里。读取不存在的全局变量得到 nil。

📥 参数

无参数

📤 返回值

全局环境表(table)

💻 用法案例
-- 遍历所有全局名字
for k, v in pairs(_G) do print(k, type(v)) end

-- 动态访问全局变量
_G['MyVar'] = 100
print(MyVar)          --> 100
说明:996 引擎中 SL(前端)、lib996 等接口都注册在 _G 上;不要随意覆盖 _G 本身。
_VERSION
📖 用途

当前 Lua 解释器的版本字符串(只读变量)。

📥 参数

无参数

📤 返回值

版本字符串(string),如 "Lua 5.1"

💻 用法案例
print(_VERSION)   --> Lua 5.1
说明:996 前端是 Lua 5.1(lua51.dll),所以不支持 5.3 的整数除法 //、位运算等语法。
assert (v [, message])
📖 用途

断言:v 为 false 或 nil 时抛出错误并中断执行,否则原样返回所有参数。常用于参数检查。

📥 参数
参数说明
v要检查的值
message可选,报错信息,默认 "assertion failed!"
📤 返回值

v 及 message 原样返回(v 非 false/nil 时)

💻 用法案例
local function SetValue(actor, lv)
    assert(lv and lv > 0, '等级必须大于0')
    -- ...后续逻辑
end
collectgarbage ([opt])
📖 用途

控制垃圾收集器。默认 opt="collect" 立即做一次完整 GC;"count" 返回当前 Lua 占用内存(KB)。

📥 参数
参数说明
opt"collect" 执行GC / "count" 查询内存(KB) / "stop" 暂停 / "restart" 恢复
📤 返回值

依 opt 而定;"count" 返回内存 KB 数

💻 用法案例
print(collectgarbage('count'), 'KB')
collectgarbage('collect')   -- 主动回收一次
dofile ([filename])
📖 用途

打开并执行指定文件的内容(编译+运行),无参数时执行标准输入。文件出错则抛错。

📥 参数
参数说明
filename文件路径,省略时读标准输入
📤 返回值

文件执行后的返回值

💻 用法案例
local cfg = dofile('config.lua')   -- config.lua 里 return {...}
说明:996 服务端 io 被沙箱限制在 Envir\ 目录内,路径越界会报 I/O error。
error (message [, level])
📖 用途

抛出一个错误(中断当前执行),由上层 pcall/xpcall 捕获。level 指定错误位置:1=当前位置(默认),2=调用 error 的函数,0=不显示位置。

📥 参数
参数说明
message错误内容(任意类型,通常是字符串)
level错误定位级别,默认 1
📤 返回值

无(永不返回)

💻 用法案例
local ok, err = pcall(function()
    error('参数不合法', 2)
end)
print(ok, err)
getfenv ([f])
📖 用途

返回函数 f环境表(全局变量访问的查找表)。f 为数字时表示栈层级(1=当前函数)。无参默认 1。

📥 参数
参数说明
f函数 或 栈层级数字
📤 返回值

环境表(table)

💻 用法案例
print(getfenv(1) == _G)   --> true(默认环境就是 _G)
getmetatable (object)
📖 用途

返回对象的元表;没有元表返回 nil。元表的 __metatable 字段若存在则返回该字段值(保护元表)。

📥 参数
参数说明
object任意对象
📤 返回值

元表(table)或 nil

💻 用法案例
local t = setmetatable({}, {__index = function() return '默认值' end})
print(getmetatable(t).__index ~= nil)
ipairs (t)
📖 用途

返回迭代器,按 1,2,3... 顺序遍历数组部分,遇到 nil 即停止。遍历哈希部分(字符串键)请用 pairs。

📥 参数
参数说明
t要遍历的表
📤 返回值

迭代函数、表 t、初始下标 0

💻 用法案例
local bag = {'木剑', '布衣', name = '背包'}
for i, v in ipairs(bag) do print(i, v) end   -- 只打印 1木剑 2布衣 3? (name 不会出现)
load (func [, chunkname]) / loadstring (s [, chunkname])
📖 用途

字符串/函数返回的片段编译成函数(不执行)。5.1 中 load 接收函数、loadstring 接收字符串;编译出错返回 nil+错误信息。

📥 参数
参数说明
func/s代码片段函数 或 代码字符串
chunkname片段名,用于报错提示
📤 返回值

编译后的函数;失败返回 nil, err

💻 用法案例
local f = loadstring('return 1 + 2')
print(f())          --> 3

local fn, err = loadstring('return @@')
print(fn, err)      --> nil + 编译错误
loadstring (s [, chunkname])
📖 用途

代码字符串编译成函数(不执行)。5.1 特有(5.3 中并入 load)。执行用户输入的 Lua 代码、动态拼逻辑时使用。

📥 参数
参数说明
s代码字符串
chunkname片段名,用于报错提示
📤 返回值

编译后的函数;失败返回 nil, err

💻 用法案例
local f = loadstring('return 1 + 2')
print(f())          --> 3

-- 996 实战: 执行软件下发的代码片段
local fn, err = loadstring(codeFromAi)
if fn then fn() else print('编译失败', err)
loadfile ([filename])
📖 用途

与 loadstring 类似,但从文件编译代码块(只编译不执行),出错返回 nil+错误。

📥 参数
参数说明
filename文件路径
📤 返回值

编译后的函数;失败返回 nil, err

💻 用法案例
local f, err = loadfile('QuestDiary/我的脚本.lua')
if f then f() else print(err) end
module (name [, ...])
📖 用途

Lua 5.1 的旧式模块声明:创建/注册名为 name 的模块表,并把当前文件的全局环境切到该表。(新代码建议用 return 表 的写法)

📥 参数
参数说明
name模块名(点分路径会建子表)
📤 返回值

💻 用法案例
-- 旧写法
module('MyLib', package.seeall)
function hello() print('hi') end

-- 新写法(推荐)
local M = {}
function M.hello() print('hi') end
return M
next (table [, index])
📖 用途

遍历表的所有键值对:返回指定 index 的下一个键。pairs 的底层实现。index 为 nil 时返回第一个键;没有下一个时返回 nil。

📥 参数
参数说明
table目标表
index上一个键(nil 表示从头开始)
📤 返回值

下一个键, 值;遍历结束返回 nil

💻 用法案例
local t = {a = 1}
local k = next(t)          -- 第一个键
while k do print(k, t[k]) k = next(t, k) end
pairs (t)
📖 用途

遍历表的全部键值对(数组部分 + 哈希部分),顺序不保证。底层用 next 实现(有 __pairs 元表时优先走元方法,5.2+)。

📥 参数
参数说明
t目标表
📤 返回值

迭代函数、表 t、nil

💻 用法案例
local cfg = {name = '练级场', lv = 30, drop = true}
for k, v in pairs(cfg) do print(k, '=', v) end
pcall (f [, arg1, ...])
📖 用途

保护模式调用函数 f:捕获其中抛出的错误而不中断程序。是版本开发里“防崩服”的第一工具。

📥 参数
参数说明
f要调用的函数
arg1...传给 f 的参数
📤 返回值

成功: true + f 的返回值;失败: false + 错误信息

💻 用法案例
local ok, err = pcall(function() error('炸了') end)
print(ok, err)      --> false  炸了

-- 996 实战: 保护第三方接口调用
local ok2 = pcall(GiveItem, actor, '木剑', 1)
print (...)
📖 用途

把所有参数转成字符串并用制表符分隔输出到标准输出(不建议用于格式化输出,用 string.format)。

📥 参数
参数说明
...任意数量的值
📤 返回值

💻 用法案例
print('Hello', 123, true)   --> Hello  123  true
rawequal (v1, v2)
📖 用途

不触发任何元方法,直接比较 v1 与 v2 是否相等。

📥 参数
参数说明
v1值1
v2值2
📤 返回值

boolean

💻 用法案例
print(rawequal({}, {}))   --> false(两个不同表)
rawget (table, index)
📖 用途

绕过元方法直接取 table[index] 的原始值(不触发 __index)。

📥 参数
参数说明
table目标表
index
📤 返回值

原始值(不存在为 nil)

💻 用法案例
local mt = {__index = function() return '元表给的' end}
local t = setmetatable({}, mt)
print(t.x)              --> 元表给的
print(rawget(t, 'x'))   --> nil(绕过元表)
rawset (table, index, value)
📖 用途

绕过元方法直接给 table[index] 赋值(不触发 __newindex)。

📥 参数
参数说明
table目标表
index
value
📤 返回值

该表 table

💻 用法案例
local t = setmetatable({}, {__newindex = function() error('禁止写入') end})
rawset(t, 'only', 1)    -- 绕过保护写入
require (modname)
📖 用途

加载模块:查 package.loaded 缓存 → 按 package.path/cpath 搜索文件 → 加载执行并把返回值存入缓存。重复 require 只加载一次。

📥 参数
参数说明
modname模块名
📤 返回值

模块返回值(通常是表)

💻 用法案例
local lib996 = require('lib996')
lib996.hello()
select (n, ...)
📖 用途

如果 n 是数字,返回第 n 个参数之后的所有参数;如果 n 是 "#",返回参数总个数。常用于处理可变参数。

📥 参数
参数说明
n位置数字 或 "#"
...可变参数列表
📤 返回值

多个参数 或 参数个数

💻 用法案例
local function sum(...)
    local total = 0
    for i = 1, select('#', ...) do
        total = total + (select(i, ...) or 0)
    end
    return total
end
print(sum(1, 2, 3))   --> 6
setfenv (f, envtable)
📖 用途

设置函数 f 的环境表为 envtable(之后 f 访问的“全局变量”都查这张表)。f 也可以是栈层级数字。是做沙箱/执行环境的核心函数。

📥 参数
参数说明
f函数 或 栈层级数字
envtable新环境表
📤 返回值

该函数 f

💻 用法案例
-- 给脚本一个受限沙箱环境
local env = {print = print, actor = actor}
setmetatable(env, {__index = _G})
local f = loadstring(userCode)
setfenv(f, env)
f()
setmetatable (table, metatable)
📖 用途

给表设置元表(nil 表示移除)。元表里的 __index/__newindex/__call/__add 等元字段改变表的行为,是 Lua 面向对象的基石。

📥 参数
参数说明
table目标表(只有表能设元表)
metatable元表(可为 nil)
📤 返回值

该表 table

💻 用法案例
local t = setmetatable({}, {
    __index = function(t, k) return '默认:' .. k end,
    __tostring = function() return '我的表' end
})
print(t.任意键)     --> 默认:任意键
print(tostring(t))  --> 我的表
tonumber (v [, base])
📖 用途

把值转成数字:v 已是数字原样返回;字符串按十进制(或指定 base 进制)解析;无法转换返回 nil。

📥 参数
参数说明
v要转换的值
base进制(2~36),默认 10
📤 返回值

数字 或 nil

💻 用法案例
print(tonumber('123') + 1)   --> 124
print(tonumber('ff', 16))    --> 255
print(tonumber('abc'))       --> nil
print(tonumber('  7  '))     --> 7(首尾空白允许)
tostring (v)
📖 用途

把任意值转成字符串:数字按常规格式;表/函数输出 "table: 0x..." 形式(有 __tostring 元方法则用其结果);布尔输出 true/false。

📥 参数
参数说明
v任意值
📤 返回值

字符串

💻 用法案例
print('等级: ' .. tostring(35))
print(tostring(nil))       --> nil
print(tostring(true))      --> true
type (v)
📖 用途

返回 v 的类型名字符串:"nil" / "number" / "string" / "boolean" / "table" / "function" / "thread" / "userdata"。

📥 参数
参数说明
v任意值
📤 返回值

类型名(string)

💻 用法案例
print(type(1), type('a'), type({}), type(nil))
--> number  string  table  nil
unpack (list [, i [, j]])
📖 用途

把数组下标 [i, j](默认 [1, #list])的元素全部作为独立返回值返回。5.3 中改名为 table.unpack。

📥 参数
参数说明
list数组表
i起始下标,默认 1
j结束下标,默认 #list
📤 返回值

多个元素值

💻 用法案例
local t = {10, 20, 30}
print(unpack(t))            --> 10  20  30
print(math.max(unpack(t)))  --> 30
xpcall (f, errhandler [, arg1, ...])
📖 用途

与 pcall 类似的保护调用,但可以额外指定错误处理函数(错误发生时先调用它,常见用途:debug.traceback 打印调用栈)。

📥 参数
参数说明
f要调用的函数
errhandler错误处理函数(收到错误信息)
arg1...传给 f 的参数
📤 返回值

成功: true + 返回值;失败: false + errhandler 的返回值

💻 用法案例
local ok, trace = xpcall(function()
    error('出错了')
end, function(err) return err .. '\n' .. debug.traceback() end)
print(trace)
Lua 接口说明书 · 996引擎教学资料 · chuan2.cn · 共 136 个接口
📝 我的备注-
👤 学员中心 · 备注与学习进度