2010-07-03 6 views
2

루아 코드의 아주 단순한 부분이 있습니다. 루아 코드는 루틴 코드가 어떻게 작동 하는지를 가르치면서 작성했습니다.왜이 간단한 루아 코 루틴은 작동하지 않습니까?

coroutine.wrap (F)

신체 F와 함께, 새로운 코 루틴을 작성 : 나는 coroutine.wrap있어 때까지

가 나는 spec 상태 괜찮습니다. f는 루아 함수 여야합니다. 호출 할 때마다 코 루틴 을 다시 시작하는 함수를 반환합니다. 함수에 전달 된 모든 인수 은 추가 인수로 작동하여 다시 시작합니다. 첫 번째 부울 을 제외하고는 동일한 값이 resume에서 반환됩니다. 오류가 발생하면 오류가 전파됩니다.

그러나이 코드 :

Enumeration = {} 

Enumeration.Create = function(generator) 
    return coroutine.wrap(generator, coroutine.yield) 
end 

local function TestEnumerator(yield) 
    yield(1) --ERROR HERE 
    yield(2) 
    yield(3) 
end 

local enumerator = Enumeration.Create(TestEnumerator) 
local first = enumerator() 
local second = enumerator() 
local third = enumerator() 

print (first, second, third) 

은 (I 위에서 표시 한 라인에서) 그 수율 불만을 전무하다. 내가 이해하는 바와 같이, yield는 coroutine.wrap에 전달 된 두 번째 인수 여야합니다. 그래서 어디서 잘못 될까요?

정말 확실한 해결책,

Enumeration.Create = function(generator) 
    local iter = coroutine.wrap(generator, coroutine.yield) 
    return function() 
     return iter(coroutine.yield) 
    end 
end 

답변

4

이 아래의 대답 덕분에 어떻게 coroutine.wrap 작동하지 않습니다. 첫 번째 전화에서 coroutine.yieldenumerator으로 전달해야합니다.

+0

바, 한 번 당신이 그렇게 간단하게 내가 설명서를 잘못 읽었습니다. – Martin

+0

보다 균일 한 동작을 얻으려면 래핑 된 함수의 협업이 필요하지만 시작하자 마자 생성하면 Create는 한 번만 래핑하여 yield를 설정합니다. – lhf

관련 문제