Pausar con coroutine.yield()
Parte de la sección Lógica y flujo de control del Journey de Lua de Coddy. Lección 50 de 54.
coroutine.yield(). Esto es lo que permite que una corrutina se pause a sí misma en medio de la ejecución y devuelva el control al código que la reanudó.Cuando una corrutina llama a coroutine.yield(), deja de ejecutarse inmediatamente en ese punto exacto. La próxima vez que llames a coroutine.resume() en esa corrutina, continuará justo después de la llamada a yield(), como si no hubiera ocurrido nada.Aquí tienes un ejemplo sencillo:function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- Imprime "One", luego pausa
coroutine.resume(co) -- Imprime "Two", luego pausa
coroutine.resume(co) -- Imprime "Three", luego terminaresume() ejecuta la corutina hasta que alcanza un yield(). La corutina recuerda exactamente dónde se detuvo, incluidas todas sus variables locales y su estado de ejecución.Puedes también devolver valores al ceder. Cualquier argumento que proporciones a coroutine.yield() se convierte en los valores de retorno de coroutine.resume(). Ten en cuenta que coroutine.resume() siempre devuelve un estado booleano como primer valor (true si la corrutina se ejecutó sin errores, o false si ocurrió un error), seguido de cualquier valor pasado a yield():function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
-- status es true, value es 10
local status, value = coroutine.resume(co)
print(value) -- Imprime: 10
-- status es true, value es 20
status, value = coroutine.resume(co)
print(value) -- Imprime: 20Desafío
FácilEscribe una función createYieldingCoroutine que tome count y devuelva una cadena que muestre la salida de una corrutina que produce valores varias veces.
Crea una corrutina que produzca la cadena "Step X" para cada paso del 1 a count, para un total de count pasos. Reanuda la corrutina count veces para recopilar todos los valores producidos. Devuelve todos los valores producidos concatenados con saltos de línea.
Lógica:
- Crea una función que use un bucle para producir
"Step 1","Step 2", etc., hastacount - Después de todas las producciones, la función debe completarse (sin una producción final para "Done")
- Envuelve esta función en una corrutina usando
coroutine.create() - Reanuda la corrutina
countveces y recopila cada valor producido - Concatena todos los valores producidos con caracteres de salto de línea entre ellos
- Devuelve la cadena concatenada
Parámetros:
count(número): El número de pasos que se producirán
Devuelve: Una cadena que contiene todos los valores producidos separados por saltos de línea (cadena). Formato: Step 1\nStep 2\nStep 3
Pruébalo tú mismo
function createYieldingCoroutine(count)
-- Escribe el 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 vectoresPractica por tu cuenta: Compilador de Lua online