2010-07-03 5 views
2

J'ai un petit morceau de code Lua très simple, que j'ai écrit en m'enseignant comment fonctionnent les coroutines.Pourquoi cette simple coroutine Lua ne fonctionne-t-elle pas?

j'étais bien jusqu'à ce que je suis arrivé à coroutine.wrap, les spec états:

coroutine.wrap (f)

Crée une nouvelle coroutine, avec le corps f. f doit être une fonction Lua. Renvoie une fonction qui reprend la coroutine chaque fois qu'elle est appelée. Les arguments passés à la fonction se comportent comme les arguments supplémentaires à reprendre. Renvoie les mêmes valeurs renvoyées par CV, sauf le premier booléen. En cas d'erreur, propage l'erreur.

Cependant ce code:

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) 

que le rendement est Se plaint nul (sur la ligne que j'ai marqué ci-dessus). Si je comprends bien, le rendement devrait être le deuxième argument passé dans coroutine.wrap, alors où vais-je me tromper?

solution vraiment évidente, grâce à la réponse ci-dessous

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

Répondre

4

Ce n'est pas comment coroutine.wrap fonctionne. Vous devez passer coroutine.yield dans le premier appel à enumerator.

+0

Bah, une fois que tu as dit que ça devenait si évident, je lisais mal la documentation. – Martin

+0

Pour obtenir un comportement plus uniforme, vous avez besoin de la coopération des fonctions enveloppées, mais si elles cèdent dès qu'elles commencent, Create peut envelopper et appeler une fois pour définir le rendement. – lhf

Questions connexes