resume & yield
Parte da seção Logic & Flow do Journey de Lua da Coddy — lição 51 de 54.
Na lição anterior, você aprendeu como uma corrotina pode passar valores de volta para o código principal usando coroutine.yield(). Mas a comunicação pode fluir em ambas as direções. Você também pode enviar valores para dentro de uma corrotina ao retomá-la.
Quando você chama coroutine.resume() com argumentos adicionais após o objeto coroutine, esses argumentos são passados para a coroutine. Dentro da coroutine, esses valores tornam-se os valores de retorno da chamada coroutine.yield() que a pausou.
Veja como funciona:
function receiver()
print("Coroutine started")
local value = coroutine.yield()
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Inicia e pausa no yield
coroutine.resume(co, "Hello") -- Passa "Hello" para dentro da coroutineQuando a corrotina retoma pela segunda vez, a string "Hello" é passada e se torna o valor de retorno de coroutine.yield(), que é armazenado na variável value.
Desafio
FácilEscreva uma função createEchoCoroutine que recebe initialMessage e retorna uma string mostrando a comunicação de duas vias entre o código principal e uma corrotina.
Crie uma corrotina que primeiro produz (yields) o initialMessage, depois recebe uma resposta quando é retomada e, finalmente, produz essa resposta de volta. A função deve demonstrar a passagem de valores tanto para fora quanto para dentro da corrotina.
Lógica:
- Crie uma função que produz
initialMessagee armazena o valor de retorno desse yield - Após receber o valor, produza-o de volta
- Envolva esta função em uma corrotina usando
coroutine.create() - Retome a corrotina pela primeira vez para obter a mensagem inicial
- Retome a corrotina uma segunda vez, passando
"Response" - Capture o valor produzido pelo segundo resume
- Retorne uma string no formato:
First: [first_yield]\nSecond: [second_yield]
Parâmetros:
initialMessage(string): A mensagem que a corrotina produzirá primeiro
Retornos: Uma string mostrando ambos os valores produzidos separados por uma nova linha (string). Formato: First: Hello\nSecond: Response
Folha de consulta
Você pode enviar valores para uma corrotina ao retomá-la, passando argumentos adicionais para coroutine.resume(). Esses argumentos tornam-se os valores de retorno da chamada coroutine.yield() que pausou a corrotina.
function receiver()
local value = coroutine.yield() -- Pausa e aguarda entrada
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Inicia a corrotina, pausa no yield
coroutine.resume(co, "Hello") -- Passa "Hello" para dentro da corrotinaQuando a corrotina é retomada pela segunda vez, "Hello" é passado e torna-se o valor de retorno de coroutine.yield(), que é armazenado na variável value.
Experimente você mesmo
function createEchoCoroutine(initialMessage)
-- 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 recordes