resume & yield
Parte da seção Lógica e Fluxo do Journey de Lua da Coddy — lição 51 de 54.
Na lição anterior, você aprendeu como uma coroutine 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 into uma coroutine quando você a retoma (com resume).
Quando você chama coroutine.resume() com argumentos adicionais após o objeto coroutine, esses argumentos são passados into a coroutine. Dentro da coroutine, esses valores se tornam 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 a corrotinaQuando a coroutine é retomada 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 aceite initialMessage e retorne uma string mostrando a comunicação de duas vias entre o código principal e uma corrotina.
Crie uma corrotina que primeiro faça yield de initialMessage, depois receba uma resposta quando for retomada (resume) e, finalmente, faça yield dessa 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 faça
yielddeinitialMessagee armazene o valor retornado desseyield - Após receber o valor, faça o
yielddele de volta para fora - 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 retornado do segundo
resume - Retorne uma string no formato:
First: [first_yield]\nSecond: [second_yield]
Parâmetros:
initialMessage(string): A mensagem que a corrotina faráyieldprimeiro
Retorno: Uma string mostrando ambos os valores do yield separados por uma nova linha (string). Formato: First: Hello\nSecond: Response
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 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 recordes