resume & yield
Fait partie de la section Logic & Flow 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 circuler dans les deux sens. Vous pouvez également envoyer des valeurs dans une coroutine lorsque vous la reprenez.
Lorsque vous appelez coroutine.resume() avec des arguments supplémentaires après l'objet coroutine, ces arguments sont transmis à 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 s'arrête au yield
coroutine.resume(co, "Hello") -- Passe "Hello" dans la coroutineLorsque la coroutine reprend pour la deuxième fois, la chaîne "Hello" est transmise et devient la valeur de retour de coroutine.yield(), qui est stockée dans la variable value.
Défi
FacileÉcrivez une fonction createEchoCoroutine qui prend initialMessage et renvoie une chaîne de caractères montrant la communication bidirectionnelle entre le code principal et une coroutine.
Créez une coroutine qui produit d'abord le initialMessage, puis reçoit une réponse lors de sa reprise, et enfin produit cette réponse en retour. 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
initialMessageet stocke la valeur de retour de ce yield - Après avoir reçu la valeur, produisez-la à nouveau vers l'extérieur
- 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 produira en premier
Retourne : Une chaîne montrant les deux valeurs produites séparées par un saut de ligne (string). Format : First: Hello\nSecond: Response
Aide-mémoire
Vous pouvez envoyer des valeurs dans une coroutine lors de sa reprise en passant des arguments supplémentaires à coroutine.resume(). Ces arguments deviennent les valeurs de retour de l'appel coroutine.yield() qui a mis la coroutine en pause.
function receiver()
local value = coroutine.yield() -- Met en pause et attend une entrée
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Démarre la coroutine, s'arrête au yield
coroutine.resume(co, "Hello") -- Passe "Hello" dans la coroutineLorsque la coroutine reprend pour la deuxième fois, "Hello" est transmis et devient la valeur de retour de coroutine.yield(), qui est ensuite stockée dans la variable value.
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 Logic & Flow
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