Pausando com coroutine.yield()
Parte da seção Lógica e Fluxo do Journey de Lua da Coddy — lição 50 de 54.
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 terminaresume() 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: 20Desafio
FácilEscreva 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
countvezes, 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
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
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