Menu
Coddy logo textTech

Pausando com coroutine.yield()

Parte da seção Lógica e Fluxo do Journey de Lua da Coddy — lição 50 de 54.

O verdadeiro poder das corrotinas vem da função coroutine.yield(). É isso 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 coroutine chama coroutine.yield(), ela para de executar imediatamente naquele ponto exato. A próxima vez que você chamar coroutine.resume() nessa coroutine, ela continuará de 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 termina
Note como cada chamada de resume() executa a coroutine até que ela encontre um yield(). A coroutine lembra exatamente onde parou, incluindo todas as suas variáveis locais e o estado de execução.Você também pode passar valores de volta ao suspender com yield. Quaisquer argumentos passados para coroutine.yield() tornam-se os valores de retorno de coroutine.resume(). Observe que coroutine.resume() sempre retorna um status booleano como seu primeiro valor (true se a corrotina foi executada sem erros, ou false se ocorreu um erro), seguido por quaisquer valores passados para yield():
function giveNumbers()
    coroutine.yield(10)
    coroutine.yield(20)
end

local co = coroutine.create(giveNumbers)

-- status é true, value é 10
local status, value = coroutine.resume(co)
print(value)  -- Imprime: 10

-- status é true, value é 20
status, value = coroutine.resume(co)
print(value)  -- Imprime: 20
challenge icon

Desafio

Fácil

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

Crie uma corrotina que produz a string "Step X" para cada passo de 1 até count, para um total de count passos. Retome (resume) a corrotina count vezes para coletar todos os valores produzidos. Retorne todos os valores produzidos concatenados com quebras de linha.

Lógica:

  • Crie uma função que usa um laço 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 quebra de linha entre eles
  • Retorne a string concatenada

Parâmetros:

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

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

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 Lógica e Fluxo