2014-01-09 2 views
3

이 같은 두 개의 가변 기능이 있다고 가정하자 : 다음 두 ab를 호출하고 모든 결과에 따라 a의 모든 결과를 반환 다른 기능을 구축하고자결합이 가변 기능은 결과

function a(num) 
    if num == 1 then 
    return 1 
    else 
    return 1, 2 
    end 
end  

function b(num) 
    if num == 1 then 
    return 1 
    else 
    return 1, 2 
    end 
end 

b. 나는이 같은 것을 쓰고 싶은 :

function c(num) 
    return a(num), b(num) 
end 

을하지만 그것은 단지 b에서 모든 결과 다음 a에서 첫 번째 결과를 반환합니다. 어떻게하면 좋을까요?

답변

4

마지막 함수의 모든 결과는 표현식 목록에서만 반환 할 수 있습니다. 나머지는 하나의 결과로 잘립니다. 결과

, f2() 한 결과로 절단 되었기 때문에 예상대로이

function f1() 
    return 1 
end 

function f2() 
    return 2, 3 
end 

print(f1(), f2()) 

인쇄 1 2 3 있지만

print(f2(), f1()) 

인쇄 2 1. 당신이 미리 결과 수를 알고있는 경우

해결 방법으로

, 당신은

local a, b = f1() 
local c, d = f2() 
return a, b, c, d 

을 수행 할 수 있습니다 또는 당신이를 확장하면 결과의 임의의 수를 들어,

local t1 = {f1()} 
local t2 = {f2()} 
-- Append t2 to t1 
return unpack(t1) 
1

을 수행 할 수 있습니다 목록을 목록 컨텍스트에 추가하면 첫 번째 항목 만 사용되거나 확장이 목록 컨텍스트의 끝에서 발생하는 경우 모든 항목이 사용됩니다. (Perl-ish 용어로는 미안합니다.)

테이블 생성자 { a(num) }에서 모든 목록 항목을 캡처 할 수 있습니다. 목록은 목록 컨텍스트의 마지막 항목으로 확장되므로 모든 항목이 사용됩니다.

다른 식으로 돌아 가면 unpack 기능을 사용하여 테이블을 목록으로 줄일 수 있습니다. 그러나 연속 배열에 대해서만 적용되는 표 "길이"개념을 사용합니다. 함수 결과에는 nil이 포함될 수 있으므로 계산을 통해 표의 항목 수를 측정하고 pairs 함수를 사용하여 표를 반복해야합니다.

local function a(num) 
    if num == 1 then 
    return 1 
    else 
    return nil, 2 
    end 
end  

local function b(num) 
    if num == 1 then 
    return 1 
    else 
    return nil, 2 
    end 
end 

.

local function c(num) 
    local t = {} 
    local n = 0 
    local bOffset = 0 
    for k, v in pairs({ a(num) }) do 
     table.insert(t, k, v) 
     if (k > n) then 
      n = k 
     end 
     if (k > bOffset) then 
      bOffset = k 
     end 
    end 
    for k, v in pairs({ b(num) }) do 
     table.insert(t, bOffset + k, v) 
     if (bOffset + k > n) then 
      n = bOffset + k 
     end 
    end 

    return unpack(t, 1, n) 
end 
print(nil,2,nil,2) 
print(c(0202))