Menu
Coddy logo textTech

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 termina

Observa 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: 20
challenge icon

Desafío

Fácil

Escribe 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., hasta count
  • 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 count veces, 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 termina

Pasar 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: 20

Los 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
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Logic & Flow