Pausar con coroutine.yield()
Parte de la sección Logic & Flow del Journey de Lua de Coddy — lección 50 de 54.
El verdadero poder de las corrutinas proviene de la función 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(), se detiene 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 nada hubiera pasado.
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 se pausa
coroutine.resume(co) -- Imprime "Two", luego se pausa
coroutine.resume(co) -- Imprime "Three", luego terminaObserva cómo cada llamada a resume() ejecuta la corrutina hasta que llega a un yield(). La corrutina recuerda exactamente dónde se detuvo, incluyendo todas sus variables locales y su estado de ejecución.
También puedes devolver valores al ceder la ejecución. Cualquier argumento que pases a coroutine.yield() se convierte en el valor de retorno 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) -- Imprime: 10
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 genera valores varias veces.
Crea una corrutina que genere la cadena "Step X" para cada paso desde 1 hasta count, luego imprime "Done" cuando termine. Reanuda la corrutina count + 1 veces para obtener todos los valores generados y la finalización definitiva. Devuelve todos los valores generados concatenados con saltos de línea.
Lógica:
- Crea una función que use un bucle para generar
"Step 1","Step 2", etc., hastacount - Después de todas las generaciones, la función debe completarse (sin generación final para "Done")
- Envuelve esta función en una corrutina usando
coroutine.create() - Reanuda la corrutina
countveces, recolectando cada valor generado - Concatena todos los valores generados con caracteres de salto de línea entre ellos
- Devuelve la cadena concatenada
Parámetros:
count(número): El número de pasos a generar
Devuelve: Una cadena que contiene todos los valores generados separados por saltos de línea (string). Formato: Step 1\nStep 2\nStep 3
Hoja de referencia
La función coroutine.yield() permite que una corrutina pause su ejecución y devuelva el control al llamador. Cuando se llama de nuevo a coroutine.resume(), la corrutina continúa justo después de la llamada a yield().
Uso básico de coroutine.yield():
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 terminaPasar valores con coroutine.yield():
function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value) -- Imprime: 10
status, value = coroutine.resume(co)
print(value) -- Imprime: 20Los argumentos pasados a coroutine.yield() se convierten en los valores de retorno de coroutine.resume(). La corrutina preserva todas las variables locales y el estado de ejecución entre las llamadas a yield.
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 Logic & Flow
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