resume y yield
Parte de la sección Lógica y flujo de control del Journey de Lua de Coddy — lección 51 de 54.
En la lección anterior, aprendiste cómo una coroutine puede devolver valores al código principal usando coroutine.yield(). Pero la comunicación puede fluir en ambas direcciones. También puedes enviar valores into una coroutine cuando haces resume de ella.
Cuando llamas a coroutine.resume() con argumentos adicionales después del objeto coroutine, esos argumentos se pasan a la corutina. Dentro de la corutina, estos valores se convierten en los valores de retorno de la llamada a coroutine.yield() que la pausó.
Así es como funciona:
function receiver()
print("Coroutine started")
local value = coroutine.yield()
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Inicia y se pausa en yield
coroutine.resume(co, "Hello") -- Pasa "Hello" a la corrutinaCuando la coroutine se reanuda por segunda vez, se pasa la cadena "Hello" y esta se convierte en el valor devuelto de coroutine.yield(), el cual se almacena en la variable value.
Desafío
FácilEscribe una función createEchoCoroutine que tome initialMessage y devuelva una cadena que muestre la comunicación bidireccional entre el código principal y una corrutina.
Crea una corrutina que primero produzca el initialMessage mediante yield, después reciba una respuesta al ser reanudada, y finalmente devuelva esa respuesta mediante yield. La función debe demostrar el paso de valores tanto hacia afuera como hacia adentro de la corrutina.
Lógica:
- Crea una función que produzca
initialMessageconyieldy almacene el valor devuelto por eseyield - Después de recibir el valor, devuélvelo de nuevo hacia afuera mediante
yield - Envuelve esta función en una corrutina usando
coroutine.create() - Reanuda la corrutina la primera vez para obtener el mensaje inicial
- Reanuda la corrutina por segunda vez, pasando
"Response" - Captura el valor producido mediante
yieldde la segunda reanudación - Devuelve una cadena con el formato:
First: [first_yield]\nSecond: [second_yield]
Parámetros:
initialMessage(string): El mensaje que la corrutina devolverá primero medianteyield
Devuelve: Una cadena que muestra ambos valores devueltos mediante yield separados por un salto de línea (string). Formato: First: Hello\nSecond: Response
Pruébalo tú mismo
function createEchoCoroutine(initialMessage)
-- Escribe código aquí
end
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo de control
1Iteración avanzada de tablas
Iterar con pairs()Iterar con ipairs()pairs() vs. ipairs()Resumen - Ficha de personaje2Más funciones de la librería table
table.concat()Construcción de tablas y unpack()table.sort()Ordenamiento personalizado con funcionesRepaso - Tabla de puntuaciones altas3Conceptos avanzados de funciones
Retorno de múltiples valoresFunciones variádicas (...)Funciones como valores de primera claseFunciones anónimas¿Qué es un Closure?Resumen - Manejador de eventos simple9Corrutinas para principiantes
¿Qué es una corrutina?coroutine create y resumePausar con coroutine.yield()resume y yieldComprobar el estado de la corrutinaResumen - Generador de númerosResumen - Matemática de vectores