2012-01-04 3 views
3

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}) 

인수의 임의의 수에 대한 함수를 여러 번 호출이 보이는 작은 유틸리티 기능을, 상상 이 작품은,하지만 내 버전은 언팩 및 임시 테이블을 많이 포함하기 때문에 더 convinient 방법이 있는지 궁금합니다. 당신이 C에서 smartCall을 작성하는 경우

타이

+0

작은 경고 : 코드는'func'가 단일 값을 반환한다고 가정합니다. 더 많이 반환하면 무시됩니다. 그게 니가 원하는거야? – kikito

답변

0

, 그것은 간단 수 있습니다 당신은 테이블을 생성 할 필요가 없습니다. 그래도 이것이 당신에게 편리한 지 모르겠습니다.

+0

안녕하세요, 일부 순수 LUA 모듈에서 작업하고 있으며 기본적으로 중복 코드를 많이 재 작성하지 않으려 고합니다. 하지만 몇 가지 벡터 수학에 대해서는이 생각을 잊어 버리고 중복 코드를 작성하기 만합니다. – moka

0

잠시 동안 모든 것을 문자열로 전달한 다음 올바른 함수 호출을 호출하고 tostring을 사용하여 문자열을 조작하는 방법에 대해 생각했습니다. 그냥 그때 나는 여기에 풀기보다 더 효율적이지 않다는 것을 깨달았습니다.

다음 나는 현명하게 호출 할 함수의 인수의 수를 지정하는 추가 인수를 두는 것에 대해 생각했습니다. 고정 된 수의 인수를 가진 함수에 대한 이런 식으로 smartCall은 호출되는 함수에 인수 그룹을 전달할 수 있습니다. 다시 말하지만, 인수 번호를 찾기 위해 테이블 ​​부분이나 산술을 추출해야합니다.

그래서 더 간단한 기능을 생각할 수 없습니다. 그리고 unpack은 충분히 효율적이며 그러한 호출의 전체 실행 시간에 크게 영향을 미치지 않습니다.

관련 문제