Menu
Coddy logo textTech

Pausando com coroutine.yield()

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

O verdadeiro poder das corrotinas vem da função coroutine.yield(). Isso é o que permite que uma corrotina pause a si mesma no meio da execução e devolva o controle para o código que a retomou.

Quando uma corrotina chama coroutine.yield(), ela para de rodar imediatamente naquele exato ponto. A próxima vez que você chamar coroutine.resume() naquela corrotina, ela continuará logo após a chamada yield(), como se nada tivesse acontecido.

Aqui está um exemplo simples:

function countToThree()
    print("One")
    coroutine.yield()
    print("Two")
    coroutine.yield()
    print("Three")
end

local co = coroutine.create(countToThree)
coroutine.resume(co)  -- Imprime "One", depois pausa
coroutine.resume(co)  -- Imprime "Two", depois pausa
coroutine.resume(co)  -- Imprime "Three", depois finaliza

Observe como cada chamada de resume() executa a corrotina até que ela encontre um yield(). A corrotina lembra exatamente onde parou, incluindo todas as suas variáveis locais e estado de execução.

Você também pode passar valores de volta ao suspender a execução. Quaisquer argumentos que você passar para coroutine.yield() tornam-se os valores 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

Desafio

Fácil

Escreva uma função createYieldingCoroutine que receba count e retorne uma string mostrando a saída de uma corrotina que produz (yields) valores múltiplas vezes.

Crie uma corrotina que produza a string "Step X" para cada passo de 1 até count, e então imprima "Done" quando terminar. Continue a corrotina count + 1 vezes para obter todos os valores produzidos e a conclusão final. Retorne todos os valores produzidos concatenados com quebras de linha.

Lógica:

  • Crie uma função que use um loop para produzir "Step 1", "Step 2", etc., até count
  • Após todos os yields, a função deve ser concluída (sem yield final para "Done")
  • Envolva esta função em uma corrotina usando coroutine.create()
  • Retome a corrotina count vezes, coletando cada valor produzido
  • Concatene todos os valores produzidos com caracteres de nova linha entre eles
  • Retorne a string concatenada

Parâmetros:

  • count (number): O número de passos para produzir

Retorno: Uma string contendo todos os valores produzidos separados por novas linhas (string). Formato: Step 1\nStep 2\nStep 3

Folha de consulta

A função coroutine.yield() permite que uma corrotina pause a execução e retorne o controle para quem a chamou. Quando coroutine.resume() é chamada novamente, a corrotina continua exatamente após a chamada de 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", depois pausa
coroutine.resume(co)  -- Imprime "Two", depois pausa
coroutine.resume(co)  -- Imprime "Three", depois finaliza

Passando valores com 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

Argumentos passados para coroutine.yield() tornam-se os valores de retorno de coroutine.resume(). A corrotina preserva todas as variáveis locais e o estado de execução entre os yields.

Experimente você mesmo

function createYieldingCoroutine(count)
    -- 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