2012-01-04 87 views
3

我回來到Lua的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

小警告:您的代碼假定'func''返回一個值;如果它返回更多,那些被忽略。你確定這就是你想要的嗎? – kikito 2012-01-04 22:58:16

回答

0

如果你用C寫smartCall,它會更簡單,你不需要創建表。不過,我不知道這對你是否方便。

+0

嘿,我正在研究一些純粹的lua模塊,這基本上是爲了避免重寫很多重複的代碼。但是因爲它對於一些向量數學我可能只是忘記了這個想法,而是寫了重複的代碼。 – moka 2012-01-04 17:10:40

0

有那麼一刻我想到路過的一切作爲字符串,然後操縱字符串進行有效的函數調用和使用tostring調用它;就在這時,我意識到這並不比在這裏解包更高效。

然後我想到了把它指定要巧妙地調用函數的參數個數一個額外的參數。通過固定數量參數smartCall的函數,這種方式可以將其參數組傳遞給被調用的函數。再次,這需要提取表格部分或算術來查找參數號。

所以,我想不出任何簡單的功能。並且unpack足夠高效,並且不會對這些調用的整體執行時間產生重大影響。