Menu
Coddy logo textTech

resume & yield

Parte da seção Logic & Flow do Journey de Lua da Coddy — lição 51 de 54.

Na lição anterior, você aprendeu como uma corrotina pode passar valores de volta para o código principal usando coroutine.yield(). Mas a comunicação pode fluir em ambas as direções. Você também pode enviar valores para dentro de uma corrotina ao retomá-la.

Quando você chama coroutine.resume() com argumentos adicionais após o objeto coroutine, esses argumentos são passados para a coroutine. Dentro da coroutine, esses valores tornam-se os valores de retorno da chamada coroutine.yield() que a pausou.

Veja como funciona:

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

local co = coroutine.create(receiver)
coroutine.resume(co)           -- Inicia e pausa no yield
coroutine.resume(co, "Hello")  -- Passa "Hello" para dentro da coroutine

Quando a corrotina retoma pela segunda vez, a string "Hello" é passada e se torna o valor de retorno de coroutine.yield(), que é armazenado na variável value.

challenge icon

Desafio

Fácil

Escreva uma função createEchoCoroutine que recebe initialMessage e retorna uma string mostrando a comunicação de duas vias entre o código principal e uma corrotina.

Crie uma corrotina que primeiro produz (yields) o initialMessage, depois recebe uma resposta quando é retomada e, finalmente, produz essa resposta de volta. A função deve demonstrar a passagem de valores tanto para fora quanto para dentro da corrotina.

Lógica:

  • Crie uma função que produz initialMessage e armazena o valor de retorno desse yield
  • Após receber o valor, produza-o de volta
  • Envolva esta função em uma corrotina usando coroutine.create()
  • Retome a corrotina pela primeira vez para obter a mensagem inicial
  • Retome a corrotina uma segunda vez, passando "Response"
  • Capture o valor produzido pelo segundo resume
  • Retorne uma string no formato: First: [first_yield]\nSecond: [second_yield]

Parâmetros:

  • initialMessage (string): A mensagem que a corrotina produzirá primeiro

Retornos: Uma string mostrando ambos os valores produzidos separados por uma nova linha (string). Formato: First: Hello\nSecond: Response

Folha de consulta

Você pode enviar valores para uma corrotina ao retomá-la, passando argumentos adicionais para coroutine.resume(). Esses argumentos tornam-se os valores de retorno da chamada coroutine.yield() que pausou a corrotina.

function receiver()
    local value = coroutine.yield()  -- Pausa e aguarda entrada
    print("Received: " .. value)
end

local co = coroutine.create(receiver)
coroutine.resume(co)           -- Inicia a corrotina, pausa no yield
coroutine.resume(co, "Hello")  -- Passa "Hello" para dentro da corrotina

Quando a corrotina é retomada pela segunda vez, "Hello" é passado e torna-se o valor de retorno de coroutine.yield(), que é armazenado na variável value.

Experimente você mesmo

function createEchoCoroutine(initialMessage)
    -- Escreva o código aqui
end
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Logic & Flow