Menu
Coddy logo textTech

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.

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(), 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 termina
Observa cómo cada llamada a resume() 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: 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 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., hasta count
  • 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 count veces 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
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 Lógica y flujo de control

Practica por tu cuenta: Compilador de Lua online