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 finalizaObserve 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: 20Desafio
FácilEscreva 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
countvezes, 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 finalizaPassando 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: 20Argumentos 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
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
1Iteração Avançada de Tabelas
Iterando com pairs()Iterando com ipairs()pairs() vs. ipairs()Revisão - Ficha de Personagem2Mais Funções da Biblioteca Table
table.concat()Construção de tabelas e unpack()table.sort()Ordenação personalizada com funçõesRecapitulação - Placar de recordes3Conceitos Avançados de Funções
Retornando Múltiplos ValoresFunções Variádicas (...)Funções como Valores de Primeira ClasseFunções AnônimasO que é uma Closure?Recapitulação - Manipulador de Eventos Simples9Coroutines para Iniciantes
O que é uma Coroutine?coroutine create & resumePausando com coroutine.yield()resume & yieldVerificando o Status da CoroutineRecapitulação - Gerador de NúmerosRecapitulação - Matemática de Vetores