Lua中如何将函数返回值的首个值单独存储、其余存入列表?
Lua:分离函数返回值——单独存储第一个,其余存入列表
给定如下Lua函数:
function pullEvent() return "eventName", "eventArg1", "eventArg2", "eventArg3", "eventArg4" end
该函数的返回值数量由第一个返回值决定。需求是将第一个返回值存入单独变量,其余所有返回值存入一个列表。
我原本尝试这样写,但属于无效语法:
local eventName, { eventArgs } = pullEvent()
当前的实现方式可行,但希望找到更简洁的写法,最好无需创建额外的event变量:
local event = { pullEvent() } local eventName, eventArgs = event[1], { table.unpack(event, 2) }
简洁解决方案
方案1:无中间变量的单行写法
通过立即执行的匿名函数,直接完成拆分,完全不需要额外中间变量:
local eventName, eventArgs = (function(...) return ..., {select(2, ...)} end)(pullEvent())
原理说明:
- 匿名函数接收
pullEvent()的所有返回值作为可变参数... - 先返回第一个返回值(通过
...自动展开),再用select(2, ...)获取从第二个开始的所有返回值,将其打包成列表后返回 - 最终通过多重赋值,把第一个值存入
eventName,列表存入eventArgs
方案2:定义工具函数(适合重复使用)
如果需要多次进行类似操作,定义工具函数会更整洁:
local function splitFirstReturn(...) local allArgs = {...} return allArgs[1], { table.unpack(allArgs, 2) } end -- 使用时直接调用 local eventName, eventArgs = splitFirstReturn(pullEvent())
注:Lua 5.1环境下需要把table.unpack替换为unpack
方案3:利用table.pack(Lua 5.2+)
Lua 5.2及以上版本中,table.pack会返回包含所有参数的表,同时带有n字段记录参数数量,写法如下:
local ret = table.pack(pullEvent()) local eventName, eventArgs = ret[1], { table.unpack(ret, 2, ret.n) }
如果想压缩成一行,可通过do-end块包裹:
local eventName, eventArgs; do local ret = table.pack(pullEvent()); eventName, eventArgs = ret[1], { table.unpack(ret, 2, ret.n) } end
内容的提问来源于stack exchange,提问作者Patrik Capay SK
相关产品推荐
相关产品推荐

