CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

Lua+多重返回值:函数返回值的截取与传递本质

2026-09-29 15:16 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【语法算法】

返回值的截取本质就这一行:

lua
local a, b, c = fn()

函数返回三个值,左侧三个变量各接一个——多余的返回值被丢弃,不足的补 nil——多重返回值的全部机制就这一行。可这一行的前后各有一个细节:前面是"返回值只在校一取一的场景下有意义",后面是"返回值作为表达式的一部分时会被截断为一个"。今天拆开。

一、多返、截取、传递三段

多重返回值的三段。多返:函数可以返回多个值——return a, b, c 返回三个值——多返回值是 Lua 和 C 系语言最大的区别之一。截取:左侧变量少于返回值时多余的丢弃,左侧变量多于返回值时不足的补 nil——截取的规则是"从左到右一一对应,多退少补"。传递:多返回值作为另一个函数的最后一个参数时会全部展开传递——作为非最后参数时只取第一个——fn(fn()) 和 fn(fn(), other) 的语义完全不同。三段连起来:多重返回值玩的是"函数的输出可以是多个值"——多个返回值的语义不是"返回一个表"而是"返回多个独立的值"。

mermaid
graph TD
    A["fn() 返回 1, 2, 3"] --> B["local a, b = fn()"]
    B --> C["a=1, b=2, 3被丢弃"]
    A --> D["local a, b, c, d = fn()"]
    D --> E["a=1, b=2, c=3, d=nil"]
    A --> F["fn(fn(), 10)"]
    F --> G["fn的第一个参数=1, 第二个=10"]

二、截取的正确写法

lua
local function getPlayerData(id)
    return "玩家" .. id, 42, "战士"
end

local name, level, job = getPlayerData(1)
print(name, level, job)

-- 只取前两个
local name2, level2 = getPlayerData(2)

-- 只取第三个(跳过前两个)
local _, _, job2 = getPlayerData(3)

下划线 _ 是约定俗成的"我不关心这个值"——不是语法要求,是编码风格——_ 就是普通变量名,可以赋值可以覆盖。

三、截断的规则与展开的时机

多返回值作为表达式的一部分时会被截断为一个——fn() + 1 只取 fn 的第一个返回值——{fn()} 展开所有返回值到表——两者的分界线是"表达式的上下文":算术运算和比较运算截断为一个,函数调用和表构造展开所有。和 select 的分账写清楚:select 是在函数体内处理传入参数的工具,多重返回值是函数体对外输出结果的工具——select 管的是"进来的参数怎么取",多返回值管的是"出去的结果怎么给"——一个管入口一个管出口,两者配合使用就是完整的参数处理链。最后一条纪律:多返回值的顺序就是文档——return name, level, job 的顺序就是调用者的阅读顺序——顺序一变调用方全崩——返回值的顺序就是 API 的契约,改顺序就是破坏 API。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

绝境回纹:血越少纹越亮,一口气回到满

【游戏功能】 再抛一个老问题:奶量是固定好还是浮动好?固定回五十的术式,满血喝是五十、残血喝也是五十,账目清楚,可总差点意思…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

蚀蓝纹咒:抽干它的法力,咒念憋在喉咙里

【游戏功能】 前阵子一场"永动机事故"在群里传了半天:某个会喷火的精英怪被玩家围了一整晚,火喷了八个钟头没停——后台一看,它…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

双纹换形:红纹饮刀蓝纹披甲,一念换身

【游戏功能】 mode=mode==='red'?'blue':'red' ——先拆这一行。一个变量存着当前纹色,三元运算符…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

免死金纹:纹碎金光,刀下留人一线

【游戏功能】 上一版埋了个查了半宿的隐蔽报错:测试组报"玩家血条归零了人还站着",后台的死亡日志一条没有,复活接口也没被调过…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

夺纹掠势:剥了它的怒,披在我身上

【游戏功能】 先抛一个坑:增益为什么只能自己挂?怒气、护体、神行,攻略里全在教你"什么时候开自己的招",可怪身上明晃晃挂着的…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

反纹镜咒:纹光一闪,它的火原路奉还

【游戏功能】 昨天夜里一场线上事故把"反纹"顶上了台面:一个玩家把反纹挂在自己身上站桩挂机,怪的火球过来他没倒,反倒躺下的是…

2026-10-01 20:32 996 技术组