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
Sommario
Funzioni
Chiude e mette la coroutine fornita in uno stato morto.
Crea una nuova coroutine, con body f. f deve essere una funzione Lua.
Restituisce true se la coroutine di questa funzione viene chiamata all'interno di può sicuramente produrre.
Avvia o continua l'esecuzione di coroutine co .
Restituisce la coroutine in esecuzione.
Restituisce lo stato di coroutine co come una Stringa.
Crea una nuova coroutine e restituisce una funzione che, quando viene chiamata, riprende la coroutine.
Sospende l'esecuzione della coroutine.
Funzioni
close
Chiude e mette la coroutine fornita in uno stato morto. Questa funzione restituisce true a meno che la coroutine non sia in uno stato di errore, in cui caso restituisce false e il messaggio di errore. Una coroutine che si sta eseguendo non può essere chiusa. Una coroutine non può essere ripresa dopo averla chiusa.
Parametri
isyieldable
Restituisce true se la coroutine chiamata in tempo di esecuzione può rilasciare in sicurezza. L'uso di una coroutine all'interno dei metodi metametodi o C è proibito, con l'eccezione di pcall e xpcall .
Restituzioni
Indipendentemente dal fatto che la coroutine possa o meno produrre in sicurezza a questo punto.
resume
Inizia o continua l'esecuzione di coroutine co . La prima volta che riprendi una coroutine, inizia a eseguire il suo corpo. I valori ... vengono passati come gli argomenti alla funzione coroutine. Se la coroutine ha Messaggio
Parametri
status
Restituisce lo stato di coroutine co, come una Stringa: 'running', se la coroutine è in esecuzione (cioè, chiama lo Stato); 'suspended', se la coroutine è sospesa in un call to yield, o se non ha ancora iniziato a correre; 'normale' se la coroutine è attiva ma non in esecuzione (cioè, ha riassunto un'altra coroutine); e 'dead' se la coroutine ha finito la sua funzione corporea, o se non ha iniziato con
Parametri
Restituzioni
wrap
Crea una nuova coroutine, con body f. f deve essere una funzione Lua. Ritorna una funzione che riprende la coroutine ogni volta che viene chiamata. Ritorna una funzione che si comporta come gli argomenti extra per riprendere. Ritorna gli stessi valori restituiti dalla funzione, ad eccezione del primo booleano. In caso di errore, propaga l'errore.
Parametri
Restituzioni
yield
Sospende l'esecuzione della coroutine di chiamata. Tutti gli argomenti per produrre vengono passati come risultati extra per riprendere. La produzione di una coroutine all'interno dei metodi metodi o delle funzioni C è proibita, con l'eccezione di pcall e xpcall .