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 coroutine llama a coroutine.yield(), se detiene inmediatamente en ese punto exacto. La próxima vez que llames a coroutine.resume() en esa coroutine, 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 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.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(). Ten en cuenta que coroutine.resume() siempre devuelve un estado (status) booleano como su primer valor (true si la rutina 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 (yield) valores múltiples veces.

Crea una corrutina que devuelva la cadena "Step X" para cada paso desde 1 hasta count, para un total de count pasos. Reanuda la corrutina count veces para recolectar todos los valores devueltos. Devuelve todos los valores recolectados 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 todos los yields, la función debe completarse (sin yield final para "Done")
  • Envuelve esta función en una corrutina usando coroutine.create()
  • Reanuda la corrutina count veces, recolectando cada valor devuelto por yield
  • Concatena todos los valores recolectados con caracteres de salto de línea entre ellos
  • Devuelve la cadena concatenada

Parámetros:

  • count (número): El número de pasos a producir con yield

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