Menu
Coddy logo textTech

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 coroutine

Lorsque 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.

challenge icon

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 initialMessage et 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 coroutine

Lorsque 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
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