Menu
Coddy logo textTech

resume y yield

Parte de la sección Logic & Flow del Journey de Lua de Coddy — lección 51 de 54.

En la lección anterior, aprendiste cómo una corrutina puede devolver valores al código principal usando coroutine.yield(). Pero la comunicación puede fluir en ambas direcciones. También puedes enviar valores dentro de una corrutina cuando la reanudas.

Cuando llamas a coroutine.resume() con argumentos adicionales después del objeto coroutine, esos argumentos se pasan a la coroutine. Dentro de la coroutine, estos valores se convierten en los valores de retorno de la llamada coroutine.yield() que la pausó.

Así es como funciona:

function receiver()
    print("Coroutine started")
    local value = coroutine.yield()
    print("Received: " .. value)
end

local co = coroutine.create(receiver)
coroutine.resume(co)           -- Inicia y se pausa en yield
coroutine.resume(co, "Hello")  -- Pasa "Hello" a la corrutina

Cuando la corrutina se reanuda por segunda vez, la cadena "Hello" se pasa y se convierte en el valor de retorno de coroutine.yield(), que se almacena en la variable value.

challenge icon

Desafío

Fácil

Escribe una función createEchoCoroutine que reciba initialMessage y devuelva una cadena que muestre la comunicación bidireccional entre el código principal y una corrutina.

Crea una corrutina que primero devuelva (yield) el initialMessage, luego reciba una respuesta cuando se reanude y, finalmente, devuelva esa respuesta de nuevo. La función debe demostrar el paso de valores tanto hacia afuera como hacia adentro de la corrutina.

Lógica:

  • Crea una función que devuelva initialMessage y almacene el valor de retorno de ese yield
  • Después de recibir el valor, devuélvelo de nuevo (yield)
  • Envuelve esta función en una corrutina usando coroutine.create()
  • Reanuda la corrutina la primera vez para obtener el mensaje inicial
  • Reanuda la corrutina una segunda vez, pasando "Response"
  • Captura el valor devuelto por el segundo resume
  • Devuelve una cadena con el formato: First: [first_yield]\nSecond: [second_yield]

Parámetros:

  • initialMessage (string): El mensaje que la corrutina devolverá primero

Devuelve: Una cadena que muestra ambos valores devueltos separados por una nueva línea (string). Formato: First: Hello\nSecond: Response

Hoja de referencia

Puedes enviar valores a una corrutina al reanudarla pasando argumentos adicionales a coroutine.resume(). Estos argumentos se convierten en los valores de retorno de la llamada a coroutine.yield() que pausó la corrutina.

function receiver()
    local value = coroutine.yield()  -- Pausa y espera una entrada
    print("Received: " .. value)
end

local co = coroutine.create(receiver)
coroutine.resume(co)           -- Inicia la corrutina, se pausa en yield
coroutine.resume(co, "Hello")  -- Pasa "Hello" a la corrutina

Cuando la corrutina se reanuda por segunda vez, se pasa "Hello" y se convierte en el valor de retorno de coroutine.yield(), el cual se almacena en la variable value.

Pruébalo tú mismo

function createEchoCoroutine(initialMessage)
    -- 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