Riprendere e sospendere
Fa parte della sezione Logica e flusso del percorso Lua di Coddy. Lezione 51 di 54.
Nella lezione precedente, hai imparato come una coroutine possa passare valori al codice principale usando coroutine.yield(). Ma la comunicazione può fluire in entrambe le direzioni. Puoi anche inviare valori all'interno di una coroutine quando la riprendi.
Quando chiami coroutine.resume() con argomenti aggiuntivi dopo l'oggetto coroutine, questi argomenti vengono passati alla coroutine. All'interno della coroutine, questi valori diventano i valori restituiti dalla chiamata a coroutine.yield() che l'ha sospesa.
Ecco come funziona:
function receiver()
print("Coroutine started")
local value = coroutine.yield()
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Inicia y se pausa en yield
coroutine.resume(co, "Hello") -- Pasa "Hello" a la corrutinaQuando la coroutine riprende per la seconda volta, viene passata la stringa "Hello" e diventa il valore restituito da coroutine.yield(), che viene memorizzato nella variabile value.
Sfida
FacileScrivi una funzione createEchoCoroutine che accetta initialMessage e restituisce una stringa che mostra la comunicazione bidirezionale tra il codice principale e una coroutine.
Crea una coroutine che prima restituisce initialMessage, poi riceve una risposta quando viene ripresa e infine restituisce quella risposta. La funzione dovrebbe mostrare il passaggio di valori sia in uscita dalla coroutine sia in entrata.
Logica:
- Crea una funzione che restituisce
initialMessagee memorizza il valore restituito da tale yield - Dopo aver ricevuto il valore, restituiscilo con uno yield
- Racchiudi questa funzione in una coroutine usando
coroutine.create() - Riprendi la coroutine la prima volta per ottenere il messaggio iniziale
- Riprendi la coroutine una seconda volta, passandole
"Response" - Acquisisci il valore restituito con lo yield della seconda ripresa
- Restituisci una stringa nel formato:
First: [first_yield]\nSecond: [second_yield]
Parametri:
initialMessage(stringa): il messaggio che la coroutine restituirà per primo
Restituisce: una stringa che mostra entrambi i valori restituiti con yield, separati da un carattere di nuova riga (stringa). Formato: First: Hello\nSecond: Response
Provalo tu
function createEchoCoroutine(initialMessage)
-- Scrivi il codice qui
end
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Iterazione avanzata delle tabelle
Iterare con pairs()Iterare con ipairs()pairs() vs. ipairs()Riepilogo - Scheda del personaggio2Altre funzioni della libreria table
table.concat()Costruzione di tabelle e unpack()table.sort()Ordinamento personalizzato con funzioniRiepilogo - Tabellone dei punteggi più alti3Concetti avanzati sulle funzioni
Restituire più valoriFunzioni variadiche (...)Funzioni come valori di prima classeFunzioni anonimeChe cos'è una closure?Riepilogo - Gestore di eventi semplice9Le coroutine per principianti
Che cos'è una coroutine?Creare e riprendere una coroutineMettere in pausa con coroutine.yield()Riprendere e sospendereVerificare lo stato della coroutineRiepilogo - Generatore di numeriRiepilogo - Matematica vettorialeEsercitati da solo: Compilatore Lua online