coroutine

Visualizza obsoleti

*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>
StatoSignificato

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 riprende
local 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, Ciao
print(coroutine.resume(repetitionCoro)) -- vero, HelloHello
print(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")) -- Ciao
print(f()) -- CiaoCiao
print(f()) -- HelloHelloHello

Sommario

Funzioni

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

Restituzioni

true a meno che la coroutine non sia chiusa in uno stato di errore.

Variant<string, void>

Il Messaggiodi errore, se presente.

create

Crea una nuova coroutine, con body f. f deve essere una funzione Lua.

Parametri

Restituzioni

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

...: Variant

Restituzioni

Variant<Tuple, string>

running

Restituisce la coroutine in esecuzione.

Restituzioni

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

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

Tuple<Variant>

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 .

Parametri

...: Tuple

Restituzioni

Tuple<Variant>