Verificando o Status da Coroutine
Parte da seção Lógica e Fluxo do Journey de Lua da Coddy. Lição 52 de 54.
Ao trabalhar com corrotinas, você frequentemente precisará saber em que estado uma corrotina se encontra. Ela está em execução no momento? Está pausada e aguardando para ser retomada? Ela terminou de ser executada?
Lua fornece a função coroutine.status() para responder a essas perguntas.
A função coroutine.status() recebe uma corrotina como seu argumento e retorna uma string descrevendo seu estado atual. Existem três estados possíveis:
| "suspended" | A corrotina está pausada em um yield() e pode ser retomada |
| "running" | A corrotina está em execução no momento |
| "dead" | A corrotina terminou a execução e não pode ser retomada novamente |
Veja como usá-lo:
function task()
coroutine.yield()
print("Finishing")
end
local co = coroutine.create(task)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "suspended" (pausado no yield)
coroutine.resume(co)
print(coroutine.status(co)) -- "dead" (finalizado)Desafio
FácilEscreva uma função checkCoroutineLifecycle que recebe resumeCount e retorna uma string mostrando o status de uma coroutine em diferentes pontos de seu ciclo de vida.
Crie uma coroutine que faz um yield uma vez e depois termina. Verifique e registre seu status após a criação, após o primeiro resume (quando ela estiver pausada no yield) e após os resumes subsequentes baseados em resumeCount.
Lógica:
- Crie uma função que faz o yield da string
"paused"uma vez e depois termina - Envolva esta função em uma coroutine usando
coroutine.create() - Verifique o status imediatamente após a criação usando
coroutine.status() - Retome (resume) a coroutine uma vez e verifique seu status novamente
- Retome a coroutine vezes adicionais com base em
resumeCount - 1(total de resumes = resumeCount) - Verifique o status final após todos os resumes
- Retorne uma string com todos os três status no formato:
initial: [status]\\nafter first resume: [status]\\nfinal: [status]
Parâmetros:
resumeCount(number): Número total de vezes para retomar a coroutine (mínimo 1)
Retorno: Uma string mostrando o status da coroutine em três pontos de seu ciclo de vida (string). Formato: initial: suspended\nafter first resume: suspended\nfinal: dead
Experimente você mesmo
function checkCoroutineLifecycle(resumeCount)
-- 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 VetoresPratique por conta própria: Compilador de Lua online