Verificando o Status da Coroutine
Parte da seção Logic & Flow 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
Folha de consulta
A função coroutine.status() retorna o estado atual de uma coroutine como uma string.
Estados possíveis:
"suspended"- A coroutine está pausada em umyield()e pode ser retomada"running"- A coroutine está sendo executada no momento"dead"- A coroutine terminou a execução e não pode ser retomada
Uso:
coroutine.status(coroutine_object)Exemplo:
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"
coroutine.resume(co)
print(coroutine.status(co)) -- "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 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