resume & yield
Fait partie de la section Logique et flux du Journey Lua de Coddy — leçon 51 sur 54.
Dans la leçon précédente, vous avez appris comment une coroutine peut renvoyer des valeurs au code principal en utilisant coroutine.yield(). Mais la communication peut fonctionner dans les deux sens. Vous pouvez également envoyer des valeurs into une coroutine lorsque vous la reprenez avec resume.
Lorsque vous appelez coroutine.resume() avec des arguments supplémentaires après l'objet coroutine, ces arguments sont transmis dans la coroutine. À l'intérieur de la coroutine, ces valeurs deviennent les valeurs de retour de l'appel à coroutine.yield() qui l'a mise en pause.
Voici comment cela fonctionne :
function receiver()
print("Coroutine started")
local value = coroutine.yield()
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Démarre et se met en pause au yield
coroutine.resume(co, "Hello") -- Passe "Hello" dans la coroutineLorsque la coroutine reprend une seconde fois, la chaîne "Hello" est transmise et devient la valeur de retour de coroutine.yield(), qui est ensuite stockée dans la variable value.
Défi
FacileÉcrivez une fonction createEchoCoroutine qui prend initialMessage et renvoie une chaîne affichant la communication bidirectionnelle entre le code principal et une coroutine.
Créez une coroutine qui produit d'abord initialMessage via yield, puis reçoit une réponse lorsqu'elle est reprise, et enfin produit cette réponse en retour via yield. La fonction doit démontrer le passage de valeurs à la fois vers l'extérieur et vers l'intérieur de la coroutine.
Logique :
- Créez une fonction qui produit
initialMessageviayieldet stocke la valeur de retour de ceyield - Après avoir reçu la valeur, produisez-la à nouveau vers l'extérieur via
yield - Enveloppez cette fonction dans une coroutine en utilisant
coroutine.create() - Reprenez la coroutine une première fois pour obtenir le message initial
- Reprenez la coroutine une seconde fois en passant
"Response" - Capturez la valeur produite lors de la seconde reprise
- Renvoyez une chaîne au format :
First: [first_yield]\nSecond: [second_yield]
Paramètres :
initialMessage(string) : Le message que la coroutine va produire en premier
Rend : Une chaîne montrant les deux valeurs produites séparées par un saut de ligne (string). Format : First: Hello\nSecond: Response
Essayez vous-même
function createEchoCoroutine(initialMessage)
-- Écrivez le code ici
end
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et flux
1Itération avancée des tables
Itérer avec pairs()Itérer avec ipairs()pairs() vs. ipairs()Récapitulatif - Fiche de personnage2Plus de fonctions de la bibliothèque table
table.concat()Construction de table & unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des scores3Concepts avancés sur les fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu'est-ce qu'une closure ?Récapitulatif - Gestionnaire d'événements simple