Menu
Coddy logo textTech

Pause avec coroutine.yield()

Fait partie de la section Logique et flux du Journey Lua de Coddy — leçon 50 sur 54.

Le véritable pouvoir des coroutines provient de la fonction coroutine.yield(). C'est ce qui permet à une coroutine de se mettre en pause au milieu de son exécution et de redonner le contrôle au code qui l'a reprise.Lorsqu'une `coroutine` appelle coroutine.yield(), elle s'arrête immédiatement de s'exécuter à ce point précis. La fois suivante où vous appelez coroutine.resume() sur cette `coroutine`, elle reprendra juste après l'appel à yield(), comme si de rien n'était.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 termine
Remarquez comment chaque appel à resume() exécute la coroutine jusqu'à ce qu'elle atteigne un yield(). La coroutine se souvient exactement d'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 d'un `yield`. Tous les arguments que vous fournissez à coroutine.yield() deviennent les valeurs de retour de coroutine.resume(). Notez que coroutine.resume() renvoie toujours un statut booléen status comme première valeur (true si le coroutine s'est exécuté sans erreur, ou false si une erreur s'est produite), suivi de toutes les 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 : 20
challenge icon

Défi

Facile

Écrivez une fonction createYieldingCoroutine qui prend count et renvoie une chaîne affichant la sortie d'une coroutine qui produit (yield) des valeurs plusieurs fois.

Créez une coroutine qui transmet la chaîne "Step X" pour chaque étape de 1 à count, pour un total de count étapes. Reprenez (resume) la coroutine count fois pour collecter toutes les valeurs produites. Renvoyez toutes les valeurs produites concaténées avec des sauts de ligne.

Logique :

  • Créez une fonction qui utilise une boucle pour produire "Step 1", "Step 2", etc., jusqu'à count
  • Après tous les yields, la fonction doit se terminer (pas de yield final pour "Done")
  • Enveloppez cette fonction dans une coroutine en utilisant coroutine.create()
  • Relancez la coroutine count fois, en collectant chaque valeur produite
  • Concaténez toutes les valeurs produites avec des caractères de saut de ligne entre elles
  • Renvoyez la chaîne concaténée

Paramètres :

  • count (number) : Le nombre d'étapes à produire

Valeur de retour : 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
quiz iconTestez-vous

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