在变量赋值中,处理可变值的惯用方法是什么?

我有一些代码想要从函数中获取一些额外的返回值,并在以后将它们传递给下游:

local ok, ... = coroutine.resume(co)
do_stuff(ok)
return ...

然而,由于变量分配中的 ... 是语法错误,因此无法运行此代码。

我可以通过使用旧方法“函数参数和变量具有相等性”和立即调用函数来解决此限制。

return (function(ok, ...)
    do_stuff(ok)
    return ...
)(coroutine.resume(co))

但是,我想这样做可能不太符合语言习惯或效率。是否有更合理的方法来解决处理 resume 调用返回的剩余值的问题?

编辑:顺便说一句,这需要处理额外参数中的 nil

编辑2:看起来使用立即调用函数一直是最好的方法。

点赞
用户1516484
用户1516484

使用不确定数量返回值的惯用方式是将函数调用包装在一个表构造器中:

local t = { coroutine.resume(co) }
do_stuff(table.remove(t, 1))
return unpack(t)  -- 在 Lua 5.2 中使用 table.unpack(t)

虽然这也涉及创建临时对象,但这应该比使用闭包要快得多,并且肯定更加整洁。

2013-01-29 08:57:36
用户1847592
用户1847592

在我看来,最好的方法是将可选参数作为参数传递给辅助函数,就像您在问题中所做的那样。

另一种方法是“打包解包”:

-- 仅适用于Lua 5.2
local t = table.pack(coroutine.resume(co))
do_stuff(t[1])
return table.unpack(t, 2, t.n)
2013-01-29 10:38:21