coroutine create & resume
Parte da seção Logic & Flow do Journey de Lua da Coddy — lição 49 de 54.
Agora que você entende o que são corrotinas, vamos aprender como realmente criá-las e executá-las em Lua.
Para criar uma corrotina, você usa a função coroutine.create(). Esta função recebe uma função comum como seu argumento e a envolve em um objeto de corrotina. Aqui está a sintaxe básica:
function myTask()
print("Hello from coroutine!")
end
local co = coroutine.create(myTask)Neste ponto, a corrotina existe, mas ainda não começou a ser executada. A função myTask não foi chamada. Para efetivamente iniciar ou continuar a execução de uma corrotina, você usa coroutine.resume():
coroutine.resume(co)Quando você chama resume() em uma corrotina pela primeira vez, ela começa a ser executada a partir do início de sua função. Se a corrotina for executada até o fim sem pausar, ela é concluída e não pode ser retomada novamente.
Aqui está um exemplo completo:
function greet()
print("Starting...")
print("Finishing!")
end
local co = coroutine.create(greet)
coroutine.resume(co) -- Imprime ambas as mensagensA corrotina é executada do início ao fim de uma só vez. Na próxima lição, você aprenderá como fazer as corrotinas pausarem no meio da execução.
Desafio
FácilEscreva uma função runSimpleCoroutine que recebe uma message e retorna a saída de uma coroutine que imprime essa mensagem.
Crie uma coroutine usando coroutine.create() que envolve uma função que imprime a mensagem fornecida. Em seguida, use coroutine.resume() para executar a coroutine. A função deve retornar a mensagem que foi impressa.
Lógica:
- Defina uma função que imprime o parâmetro message
- Crie uma coroutine a partir dessa função usando
coroutine.create() - Retome a coroutine usando
coroutine.resume() - Retorne a mensagem que foi impressa
Parâmetros:
message(string): A mensagem a ser impressa pela coroutine
Retorna: A mensagem que foi impressa pela coroutine (string)
Folha de consulta
Para criar uma coroutine, use coroutine.create() com uma função como seu argumento:
function myTask()
print("Hello from coroutine!")
end
local co = coroutine.create(myTask)Para iniciar ou continuar a execução de uma coroutine, use coroutine.resume():
coroutine.resume(co)Exemplo completo:
function greet()
print("Starting...")
print("Finishing!")
end
local co = coroutine.create(greet)
coroutine.resume(co) -- Imprime ambas as mensagensQuando resume() é chamado pela primeira vez, a coroutine começa a ser executada desde o início. Se ela for executada até o fim sem pausar, não poderá ser retomada novamente.
Experimente você mesmo
function runSimpleCoroutine(message)
-- 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