Menu
Coddy logo textTech

Mettere in pausa con coroutine.yield()

Fa parte della sezione Logica e flusso del percorso Lua di Coddy. Lezione 50 di 54.

La vera potenza delle coroutine deriva dalla funzione 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 termina
Nota come ogni chiamata a resume() 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: 20
challenge icon

Sfida

Facile

Scrivi 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 a count
  • 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 count volte, 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
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Lua online