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
Bah, une fois que tu as dit que ça devenait si évident, je lisais mal la documentation. – Martin
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