基础函数
BASIC全局函数与环境:类型转换、错误处理、动态加载、面向对象基石 | 本页 29 个接口。登录全站学员账号后:给函数打 ✓ 记录学习进度、写私人备注。
保存全局环境的表:所有未加 local 的全局变量都存在这张表里。读取不存在的全局变量得到 nil。
无参数
全局环境表(table)
-- 遍历所有全局名字 for k, v in pairs(_G) do print(k, type(v)) end -- 动态访问全局变量 _G['MyVar'] = 100 print(MyVar) --> 100
当前 Lua 解释器的版本字符串(只读变量)。
无参数
版本字符串(string),如 "Lua 5.1"
print(_VERSION) --> Lua 5.1
断言:v 为 false 或 nil 时抛出错误并中断执行,否则原样返回所有参数。常用于参数检查。
| 参数 | 说明 |
|---|---|
| v | 要检查的值 |
| message | 可选,报错信息,默认 "assertion failed!" |
v 及 message 原样返回(v 非 false/nil 时)
local function SetValue(actor, lv)
assert(lv and lv > 0, '等级必须大于0')
-- ...后续逻辑
end控制垃圾收集器。默认 opt="collect" 立即做一次完整 GC;"count" 返回当前 Lua 占用内存(KB)。
| 参数 | 说明 |
|---|---|
| opt | "collect" 执行GC / "count" 查询内存(KB) / "stop" 暂停 / "restart" 恢复 |
依 opt 而定;"count" 返回内存 KB 数
print(collectgarbage('count'), 'KB')
collectgarbage('collect') -- 主动回收一次打开并执行指定文件的内容(编译+运行),无参数时执行标准输入。文件出错则抛错。
| 参数 | 说明 |
|---|---|
| filename | 文件路径,省略时读标准输入 |
文件执行后的返回值
local cfg = dofile('config.lua') -- config.lua 里 return {...}抛出一个错误(中断当前执行),由上层 pcall/xpcall 捕获。level 指定错误位置:1=当前位置(默认),2=调用 error 的函数,0=不显示位置。
| 参数 | 说明 |
|---|---|
| message | 错误内容(任意类型,通常是字符串) |
| level | 错误定位级别,默认 1 |
无(永不返回)
local ok, err = pcall(function()
error('参数不合法', 2)
end)
print(ok, err)返回函数 f 的环境表(全局变量访问的查找表)。f 为数字时表示栈层级(1=当前函数)。无参默认 1。
| 参数 | 说明 |
|---|---|
| f | 函数 或 栈层级数字 |
环境表(table)
print(getfenv(1) == _G) --> true(默认环境就是 _G)
返回对象的元表;没有元表返回 nil。元表的 __metatable 字段若存在则返回该字段值(保护元表)。
| 参数 | 说明 |
|---|---|
| object | 任意对象 |
元表(table)或 nil
local t = setmetatable({}, {__index = function() return '默认值' end})
print(getmetatable(t).__index ~= nil)返回迭代器,按 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 不会出现)把字符串/函数返回的片段编译成函数(不执行)。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 + 编译错误把代码字符串编译成函数(不执行)。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)与 loadstring 类似,但从文件编译代码块(只编译不执行),出错返回 nil+错误。
| 参数 | 说明 |
|---|---|
| filename | 文件路径 |
编译后的函数;失败返回 nil, err
local f, err = loadfile('QuestDiary/我的脚本.lua')
if f then f() else print(err) endLua 5.1 的旧式模块声明:创建/注册名为 name 的模块表,并把当前文件的全局环境切到该表。(新代码建议用 return 表 的写法)
| 参数 | 说明 |
|---|---|
| name | 模块名(点分路径会建子表) |
无
-- 旧写法
module('MyLib', package.seeall)
function hello() print('hi') end
-- 新写法(推荐)
local M = {}
function M.hello() print('hi') end
return M遍历表的所有键值对:返回指定 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遍历表的全部键值对(数组部分 + 哈希部分),顺序不保证。底层用 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保护模式调用函数 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)把所有参数转成字符串并用制表符分隔输出到标准输出(不建议用于格式化输出,用 string.format)。
| 参数 | 说明 |
|---|---|
| ... | 任意数量的值 |
无
print('Hello', 123, true) --> Hello 123 true不触发任何元方法,直接比较 v1 与 v2 是否相等。
| 参数 | 说明 |
|---|---|
| v1 | 值1 |
| v2 | 值2 |
boolean
print(rawequal({}, {})) --> false(两个不同表)绕过元方法直接取 table[index] 的原始值(不触发 __index)。
| 参数 | 说明 |
|---|---|
| table | 目标表 |
| index | 键 |
原始值(不存在为 nil)
local mt = {__index = function() return '元表给的' end}
local t = setmetatable({}, mt)
print(t.x) --> 元表给的
print(rawget(t, 'x')) --> nil(绕过元表)绕过元方法直接给 table[index] 赋值(不触发 __newindex)。
| 参数 | 说明 |
|---|---|
| table | 目标表 |
| index | 键 |
| value | 值 |
该表 table
local t = setmetatable({}, {__newindex = function() error('禁止写入') end})
rawset(t, 'only', 1) -- 绕过保护写入加载模块:查 package.loaded 缓存 → 按 package.path/cpath 搜索文件 → 加载执行并把返回值存入缓存。重复 require 只加载一次。
| 参数 | 说明 |
|---|---|
| modname | 模块名 |
模块返回值(通常是表)
local lib996 = require('lib996')
lib996.hello()如果 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设置函数 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()给表设置元表(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)) --> 我的表把值转成数字: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(首尾空白允许)把任意值转成字符串:数字按常规格式;表/函数输出 "table: 0x..." 形式(有 __tostring 元方法则用其结果);布尔输出 true/false。
| 参数 | 说明 |
|---|---|
| v | 任意值 |
字符串
print('等级: ' .. tostring(35))
print(tostring(nil)) --> nil
print(tostring(true)) --> true返回 v 的类型名字符串:"nil" / "number" / "string" / "boolean" / "table" / "function" / "thread" / "userdata"。
| 参数 | 说明 |
|---|---|
| v | 任意值 |
类型名(string)
print(type(1), type('a'), type({}), type(nil))
--> number string table nil把数组下标 [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与 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)