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 imediatamente de executar exatamente nesse ponto. Na próxima vez que você chamar coroutine.resume() nessa coroutine, ela continuará a partir de logo depois da chamada a 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 receba count e retorne uma string mostrando a saída de uma corrotina que produz valores várias vezes.
Crie uma corrotina que produza a string "Step X" para cada etapa de 1 a count, totalizando count etapas. Retome 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 use um loop para produzir
"Step 1","Step 2"etc., atécount - Após todas as produções, a função deve ser concluída (sem uma produção final para "Done")
- Envolva essa 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 etapas a serem produzidas
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çõesRevisão - Placar de pontuações máximas3Conceitos Avançados de Funções
Retornando Múltiplos ValoresFunções Variádicas (...)Funções como Valores de Primeira ClasseFunções AnônimasO que é um Closure?Recapitulação - Manipulador de Eventos Simples9Corrotinas para iniciantes
O que é uma corrotina?criar e retomar uma corrotinaPausando com coroutine.yield()resume e yieldVerificando o status da corrotinaRecapitulação - Gerador de númerosRecapitulação - Matemática vetorialPratique por conta própria: Compilador de Lua online