Lua:任意数量的返回值

3

我已经很久没有使用Lua了,只用过C++。现在我正在努力重新理解一些更复杂的东西。

想象一下一个小型的实用函数,它的样子如下,可以为任意数量的参数多次调用一个函数:

-- helper to call a function multiple times at once
function smartCall(func, ...)
    -- the variadic arguments
    local args = {...}
    -- the table to save the return values
    local ret = {}
    -- iterate over the arguments
    for i,v in ipairs(args) do
            -- if it is a table, we unpack the table
        if type(v) == "table" then
            ret[i] = func(unpack(v))
        else
            -- else we call the function directly
            ret[i] = func(v)
        end
    end
    -- return the individual return values
    return unpack(ret)
end

那么我可以像这样做:

local a,b,c = smartCall(math.abs, -1, 2.0, -3.0)
local d,e,f = smartCall(math.min, {1.0, 0.3}, {-1.0, 2.3}, {0.5, 0.7})

这样做是可行的,但我想知道是否有更方便的方式,因为我的版本涉及大量的拆包和临时表。谢谢。

小提示:您的代码假定 func 返回单个值;如果它返回多个值,则会被忽略。您确定这是您想要的吗? - kikito
2个回答

0
如果你在C语言中编写smartCall,它会更简单,而且你不需要创建表格。虽然我不知道这对你是否方便。

嘿,我正在开发一些纯Lua模块,基本上是为了避免重写大量重复的代码。但由于它是用于某些向量数学计算,我可能会放弃这个想法,而是编写重复的代码。 - moka

0

有一瞬间我想把所有东西都传递为字符串,然后操作字符串以使其成为有效的函数调用,并使用tostring进行调用;但是我意识到这并不比在此处解包更有效。

然后我考虑添加一个额外的参数,指定您想要智能调用的函数的参数数量。这样,对于具有固定参数数量的函数,smartCall可以将其参数组传递给被调用的函数。同样,这需要提取表部分或算术运算来查找参数编号。

所以,我想不出任何更简单的函数了。而且unpack足够高效,不会对此类调用的整体执行时间产生重大影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接