引擎的接口常常一次吐出多个数据:属性的三项、坐标的 XY、查找的结果与位置。多重返回值的接收、截断与透传是 Lua 的基本功,接错了参数顺序,数据就静默地串了位。
---多重返回值的完整接收
local function getBase(actor)
-- 模拟一次返回多项的查询
return "血饮狂刀", 45, "warrior"
end
local name, level, job = getBase(actor)
print(name, level, job)
---只取前两项:多余的自动丢弃
local name2, level2 = getBase(actor)
---占位:中间的项用局部变量承接
local n3, _, job3 = getBase(actor)
多重返回值按位置对应接收:变量少则多余的返回值丢弃,变量多则不足的补 nil。中间不关心的项用下划线变量的惯例占位——占位是约定不是语法,可读性靠团队的默契。返回值可以直接透传:return f(x) 把 f 的全部返回值原样带出,包装函数的透传省去逐个解包再打包的繁琐。
---表转多重返回:unpack 的配合
local stats = { 1250, 800, 300 }
local atk, def, hp = table.unpack(stats)
print(atk, def, hp) -- 1250, 800, 300
---指定区间:只解包一部分
local atk2 = table.unpack(stats, 1, 1)
print(atk2) -- 1250
---函数调用的参数展开
local function add(a, b, c)
return a + b + c
end
print(add(table.unpack(stats))) -- 2350
table.unpack 把数组表摊开成多重返回值,与打包的方向互逆:{ f() } 把多重返回值收进表、table.unpack(t) 把表摊开传参。区间的解包(第二第三参数)只摊指定范围,长表的部分解包避免全量展开的开销。陷阱区在 nil 的尾巴:返回值序列中间的 nil 会让 { f() } 的打包提前截断——可靠的做法是让接口用「数量加数组」的模式返回,Lua 的 select('#') 可数清包含 nil 在内的全部参数。
多返回值的单测覆盖:全量接收、部分接收、中间占位、unpack 的区间四种形态;接口的返回值结构进文档,字段的数量与顺序是契约。
接收的变量顺序曾经与返回顺序颠倒,攻击力接成了等级,顺序的对照表进接口文档。unpack 曾经没传区间,含 nil 的表摊开后半段丢失,显式传边界。多返回值直接进字符串拼接,只有第一个值参与拼接,先收齐再拼的写法替代。
引擎接口的返回值清单进接口文档:数量、顺序、类型三要素。包装函数的透传用直接 return 的形态,享受尾调用的优化。多返回值与表的选型:固定的短数据用多返回值,可变长的集合用表。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 版本更新上线后突然下架了某件热销商品,但更新公告里没有提到这件事。玩家发现后截图传播,两小时内贴吧帖子超…
实战应用:用在哪里 技能升级后缺少视觉与听觉反馈,玩家不确定升级是否成功。技能升级反馈在升级成功的瞬间展示金色光效、播放升级…
实战应用:用在哪里 点击其他玩家的角色时默认弹出查看面板,但在战斗中玩家希望点击即攻击。双击检测在单击查看的基础上增加双击攻…
实战应用:用在哪里 灵宠在战斗中作用有限,玩家养了宠物但缺少日常互动。灵宠派遣让宠物成为玩家的探索伙伴:派遣灵宠外出探索获取…
实战应用:用在哪里 宠物养成线只有喂食和升级,缺少宠物之间的对抗玩法。宠物竞技让两只宠物在专属竞技场进行自动对战,玩家通过调…
实战应用:用在哪里 测试环境直接复制生产库会把真实玩家数据暴露给开发和测试人员,存在隐私泄露风险。脱敏测试库的搭建分三步:从…