Mettre en pause avec coroutine.yield()
Fait partie de la section Logique et flux du Journey Lua de Coddy. Leçon 50 sur 54.
coroutine.yield(). C’est ce qui permet à une coroutine de se mettre en pause au milieu de son exécution et de rendre le contrôle au code qui l’a reprise.Lorsqu’une coroutine appelle coroutine.yield(), elle cesse immédiatement de s’exécuter à cet endroit précis. La prochaine fois que vous appelez coroutine.resume() sur cette coroutine, elle reprend juste après l’appel à yield(), comme si rien ne s’était passé.Voici un exemple simple :function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- Affiche "One", puis se met en pause
coroutine.resume(co) -- Affiche "Two", puis se met en pause
coroutine.resume(co) -- Affiche "Three", puis se termineresume() exécute la coroutine jusqu’à ce qu’elle atteigne un yield(). La coroutine se souvient exactement de l’endroit où elle s’est arrêtée, y compris de toutes ses variables locales et de son état d’exécution.Vous pouvez également renvoyer des valeurs lors de la suspension. Tous les arguments que vous transmettez à coroutine.yield() deviennent les valeurs de retour de coroutine.resume(). Notez que coroutine.resume() renvoie toujours une valeur booléenne status en première valeur (true si la coroutine s’est exécutée sans erreur, ou false si une erreur s’est produite), suivie des éventuelles valeurs transmises à yield() :function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
-- status est true, value est 10
local status, value = coroutine.resume(co)
print(value) -- Affiche : 10
-- status est true, value est 20
status, value = coroutine.resume(co)
print(value) -- Affiche : 20Défi
FacileÉcris une fonction createYieldingCoroutine qui prend count et renvoie une chaîne affichant la sortie d’une coroutine qui produit des valeurs plusieurs fois.
Crée une coroutine qui produit la chaîne "Step X" pour chaque étape de 1 à count, soit un total de count étapes. Reprends la coroutine count fois pour récupérer toutes les valeurs produites. Renvoie toutes les valeurs produites, concaténées avec des sauts de ligne.
Logique :
- Crée une fonction qui utilise une boucle pour produire
"Step 1","Step 2", etc., jusqu’àcount - Après toutes les productions, la fonction doit s’achever (aucune production finale pour "Done")
- Encapsule cette fonction dans une coroutine à l’aide de
coroutine.create() - Reprends la coroutine
countfois, en récupérant chaque valeur produite - Concatène toutes les valeurs produites avec des caractères de nouvelle ligne entre elles
- Renvoie la chaîne concaténée
Paramètres :
count(number) : Le nombre d’étapes à produire
Renvoie : Une chaîne contenant toutes les valeurs produites, séparées par des sauts de ligne (string). Format : Step 1\nStep 2\nStep 3
Essayez vous-même
function createYieldingCoroutine(count)
-- Écrire 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() contre ipairs()Récapitulatif - Fiche de personnage2Fonctions supplémentaires de la bibliothèque table
table.concat()construction de tables et unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des meilleurs scores3Concepts avancés des fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu’est-ce qu’une fermeture ?Récapitulatif - Gestionnaire d’événements simple6Gestion des erreurs
La fonction error()Appels protégés avec pcall()Récapitulatif - Division sécurisée9Les coroutines pour débutants
Qu’est-ce qu’une coroutine ?créer et reprendre une coroutineMettre en pause avec coroutine.yield()reprendre et céderVérifier l’état d’une coroutineRécapitulatif - Générateur de nombresRécapitulatif - Calcul vectorielEntraînez-vous par vous-même : Compilateur Lua en ligne