Menu
Coddy logo textTech

Pause avec coroutine.yield()

Fait partie de la section Logic & Flow du Journey Lua de Coddy — leçon 50 sur 54.

La véritable puissance 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 relancée.

Lorsqu'une coroutine appelle coroutine.yield(), elle s'arrête immédiatement de s'exécuter à ce point précis. La prochaine fois que vous appelez coroutine.resume() sur cette coroutine, elle continuera 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 s'arrête
coroutine.resume(co)  -- Affiche "Two", puis s'arrête
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 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 l'interruption. Tous les arguments que vous passez à coroutine.yield() deviennent les valeurs de retour de coroutine.resume() :

function giveNumbers()
    coroutine.yield(10)
    coroutine.yield(20)
end

local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value)  -- Affiche : 10

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 de caractères montrant la sortie d'une coroutine qui produit (yield) des valeurs plusieurs fois.

Créez une coroutine qui produit la chaîne "Step X" pour chaque étape de 1 à count, puis affiche "Done" une fois terminée. Reprenez la coroutine count + 1 fois pour obtenir toutes les valeurs produites et la fin de l'exécution. 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()
  • Reprenez 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 (nombre) : Le nombre d'étapes à produire

Retourne : Une chaîne contenant toutes les valeurs produites séparées par des sauts de ligne (string). Format : Step 1\nStep 2\nStep 3

Aide-mémoire

La fonction coroutine.yield() permet à une coroutine de suspendre son exécution et de rendre le contrôle à l'appelant. Lorsque coroutine.resume() est appelée à nouveau, la coroutine reprend son exécution juste après l'appel à yield().

Utilisation basique de coroutine.yield() :

function countToThree()
    print("One")
    coroutine.yield()
    print("Two")
    coroutine.yield()
    print("Three")
end

local co = coroutine.create(countToThree)
coroutine.resume(co)  -- Prints "One", then pauses
coroutine.resume(co)  -- Prints "Two", then pauses
coroutine.resume(co)  -- Prints "Three", then finishes

Passer des valeurs avec coroutine.yield() :

function giveNumbers()
    coroutine.yield(10)
    coroutine.yield(20)
end

local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value)  -- Prints: 10

status, value = coroutine.resume(co)
print(value)  -- Prints: 20

Les arguments passés à coroutine.yield() deviennent les valeurs de retour de coroutine.resume(). La coroutine préserve toutes les variables locales et l'état d'exécution entre les appels à yield.

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 Logic & Flow