coroutine
*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.
Una coroutine viene utilizzata per eseguire più attività contemporaneamente all'interno dello stesso script. Tali attività possono includere la produzione di valori dagli input o l'esecuzione di lavori su una subroutine quando si risolve un problema più grande. Un'attività non ha nemmeno bisogno di avere un punto di destinazione definito, ma ha bisogno di definire particolari tempi in cui viene 生成 (pausa) per consentire ad altre cose
Uso di Coroutines
Una nuova coroutine può essere creata fornendo una funzione a coroutine.create() . Una volta creata, una coroutine non inizia a essere eseguita fino a quando la prima chiamata a
local function task(...)
-- Questa funzione potrebbe fare un po 'di lavoro e poi produrre un po 'di valore
coroutine.yield("first") -- Restituito da coroutine.resume()
-- La funzione continua una volta ripresa
return "second"
end
local taskCoro = coroutine.create(task)
-- Chiama resume per la prima volta, che esegue la funzione dall'inizio
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> vero, prima (la task chiamata coroutine.yield()}
-- Continua ad eseguire la funzione fino a quando non produce o si ferma
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
Durante la vita della coroutine, puoi chiamare coroutine.status() per ispezionare il suo Stato:
<tbody><tr><td><b>sospeso</b></td> <td>La coroutine è in attesa di essere ripreresa. Le coroutine iniziano in questo stato e vengono inserite quando la loro funzione chiama <code>coroutine.yield()</code> .</td></tr><tr><td><b>running ]</b></td><td>La coroutine è in esecuzione proprio ora.</td></tr><tr><td><b>normale</b></td> <td>La coroutine è in attesa del rendimento di un'altra coroutine; in altre parole, ha riassunto un'altra coroutine.</td></tr><tr><td><b>morto</b></td> <td>La funzione è stata interrotta (restituita o lanciata un errore). La coroutine non può essere utilizzata ulteriormente.</td></tr></tbody>
Stato | Significato |
---|
Avvolgere Coroutines
Quando si lavora con coroutines, è anche possibile rinunciare all'uso dell'oggetto coroutine e invece utilizzare una funzione wrap. Tale funzione wrap riprenderà una particolare coroutine quando viene chiamata e restituirà solo i valori ottenuti. Puoi farlo usando coroutine.wrap() :
-- Crea una coroutine e restituisce una funzione wrap che la riprendelocal f = coroutine.wrap(task)-- Riassumi la coroutine come se chiamassimo coroutine.resume()local result = f()-- Se si verifica un errore, verrà segnalato qui!-- This differs from coroutine.resume() which acts similar to pcall()
Il primo valore restituito da coroutine.resume() descrive se una coroutine è stata eseguita senza errori. Tuttavia, le funzioni restituite da coroutine.wrap() non lo faranno: invece restituiscono direttamente i valori restituiti o passati a coroutine.yield(), se applicabile. Se si verificò un erro
Esempio di modello produttore
Immagina un compito che produce ripetizioni di una parola: ogni volta che produce una ripetizione, il prossimo produce un'altra. Ad esempio, fornire Hello producerà Hello, HelloHello, 2> HelloHello2>, eccetera. Per fare questo, puoi definire 5> peatThis5> :
-- Questa funzione ripetisce una parola ogni volta che la sua coroutine viene riavviata
local function repeatThis(word)
local repetition = ""
while true do
-- Fai una ripetizione e poi ottieni il Risultato
repetition = repetition .. word
coroutine.yield(repetition)
end
end
Per eseguire questa funzione come coroutine, puoi utilizzare coroutine.create() seguito da più chiamate a coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- vero, Ciaoprint(coroutine.resume(repetitionCoro)) -- vero, HelloHelloprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
Per questa funzione del produttore, puoi anche usare coroutine.wrap() per ottenere una funzione che produce valori:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- Ciaoprint(f()) -- CiaoCiaoprint(f()) -- HelloHelloHello