我经过很长一段时间的C ++后才回到Lua,我现在正试图再次围绕一些更复杂的事情。
想象一个小的实用函数,看起来像这样,为任意数量的参数多次调用函数:
-- 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})
这有效,但我想知道是否有更方便的方式,因为我的版本涉及很多解包和临时表。
TY
答案 0 :(得分:0)
如果你在C中写smartCall
,它会更简单,你不需要创建表。不过,我不知道这对你来说是否方便。
答案 1 :(得分:0)
我想过将所有内容作为字符串传递,然后操纵字符串以进行有效的函数调用并使用tostring
调用它;就在那时,我意识到这里的解决方案效率并不高于此。
然后我考虑添加一个额外的参数来指定你想要智能调用的函数的参数个数。对于具有固定数量的参数smartCall
的函数,这种方式可以将其参数组传递给被调用的函数。同样,这个需要提取表部分或算术来查找参数号。
所以,我想不出任何更简单的功能。并且unpack
足够有效,并且不会对此类调用的总体执行时间产生重大影响。