Mettere in pausa con coroutine.yield()
Fa parte della sezione Logica e flusso del percorso Lua di Coddy. Lezione 50 di 54.
coroutine.yield(). È questo che permette a una coroutine di sospendersi nel mezzo dell’esecuzione e restituire il controllo al codice che l’ha ripresa.Quando una coroutine chiama coroutine.yield(), smette immediatamente di essere eseguita proprio in quel punto. La volta successiva che chiami coroutine.resume() su quella coroutine, continuerà subito dopo la chiamata a yield(), come se non fosse successo nulla.Ecco un semplice esempio:function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- Stampa "One", poi si interrompe temporaneamente
coroutine.resume(co) -- Stampa "Two", poi si interrompe temporaneamente
coroutine.resume(co) -- Stampa "Three", poi terminaresume() esegue la coroutine finché non incontra yield(). La coroutine ricorda esattamente dove si è fermata, incluse tutte le sue variabili locali e lo stato di esecuzione.Puoi anche restituire valori quando sospendi l’esecuzione. Gli argomenti che passi a coroutine.yield() diventano i valori restituiti da coroutine.resume(). Nota che coroutine.resume() restituisce sempre un valore booleano stato come primo valore (true se la coroutine è stata eseguita senza errori, oppure false se si è verificato un errore), seguito da eventuali valori passati a yield():function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
-- status è true, value è 10
local status, value = coroutine.resume(co)
print(value) -- Stampa: 10
-- status è true, value è 20
status, value = coroutine.resume(co)
print(value) -- Stampa: 20Sfida
FacileScrivi una funzione createYieldingCoroutine che accetta count e restituisce una stringa che mostra l’output di una coroutine che produce valori più volte.
Crea una coroutine che produce la stringa "Step X" per ogni passaggio da 1 a count, per un totale di count passaggi. Riprendi la coroutine count volte per raccogliere tutti i valori prodotti. Restituisci tutti i valori prodotti concatenati con caratteri di nuova riga.
Logica:
- Crea una funzione che usa un ciclo per produrre
"Step 1","Step 2"e così via, fino acount - Dopo tutte le produzioni, la funzione dovrebbe terminare (senza una produzione finale per "Done")
- Racchiudi questa funzione in una coroutine usando
coroutine.create() - Riprendi la coroutine
countvolte, raccogliendo ogni valore prodotto - Concatena tutti i valori prodotti con caratteri di nuova riga tra di essi
- Restituisci la stringa concatenata
Parametri:
count(numero): il numero di passaggi da produrre
Restituisce: una stringa contenente tutti i valori prodotti separati da caratteri di nuova riga (stringa). Formato: Step 1\nStep 2\nStep 3
Provalo tu
function createYieldingCoroutine(count)
-- 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