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ù compiti contemporaneamente all'interno dello stesso script.Tali compiti potrebbero includere la produzione di valori da input o l'esecuzione di lavori su una sottoroutine quando si risolve un problema più grande.Un'attività non ha nemmeno bisogno di avere un punto di fine definito, ma deve definire particolari tempi in cui produce (pausa) per lasciare che altre cose vengano lavorate.

Utilizzo delle coroutine

Una nuova coroutine può essere creata fornendo una funzione a coroutine.create() .Una volta creato, una coroutine non inizia a funzionare fino alla prima chiamata a coroutine.resume() che passa gli argomenti alla funzione.Questa chiamata restituisce quando la funzione si ferma o chiama coroutine.yield() e, quando ciò accade, coroutine.resume() restituisce i valori restituiti dalla funzione, i valori inviati a coroutine.yield() o un Messaggiodi errore.Se commette un errore, il secondo valore di ritorno è l'errore lanciato.


local function task(...)
-- Questa funzione potrebbe fare un po' di lavoro per un po', quindi produrre un po' di valore
coroutine.yield("first") -- Da restituire da coroutine.resize()
-- La funzione continua una volta ripresa di nuovo
return "second"
end
local taskCoro = coroutine.create(task)
-- Chiama il ripristino per la prima volta, che esegue la funzione dall'inizio
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> vero, prima (task chiamato 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:


<th>Significato</th>
</tr>
</thead>
<tbody>
<tr>
<td><b>sospeso</b></td>
<td>La coroutine è in attesa di essere ripresa. Le coroutine iniziano in questo stato e entrano quando la loro funzione chiama <code>coroutine.yield()</code> .</td>
</tr>
<tr>
<td><b>esecuzione</b></td>
<td>La coroutine è in esecuzione proprio ora.</td>
</tr>
<tr>
<td><b>normale</b></td>
<td>La coroutine sta aspettando il rendimento di un'altra coroutine; in altre parole, ha ripreso 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

Involucro delle coroutine

Quando lavori con le coroutine, puoi anche rinunciare all'uso dell'oggetto coroutine e invece usare una funzione wrapper.Una funzione wrapper del genere 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 wrapper che la riprende
local f = coroutine.wrap(task)
-- Riprendi la coroutine come se chiamassimo coroutine.resume()
local result = f()
-- Se si verifica un errore verrà sollevata 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 faranno ciò: invece, restituiranno direttamente i valori restituiti o passati a coroutine.yield(), se presenti.Se si è verificato un errore durante l'esecuzione della funzione coroutine, l'errore viene sollevato durante la chiamata della funzione restituita.

Esempio di modello produttore

Immagina un compito che produce ripetizioni di una parola: ogni volta che produce una ripetizione, la successiva ne produrrà un'altra.Ad esempio, fornire Hello produrrà Hello , HelloHello , HelloHelloHello , ecc.Per farlo, puoi definire repeatThis() :


-- Questa funzione ripete una parola ogni volta che la sua coroutine viene ripresa
local function repeatThis(word)
local repetition = ""
while true do
-- Fai una ripetizione poi ottieni il Risultato
repetition = repetition .. word
coroutine.yield(repetition)
end
end

Per eseguire questa funzione come coroutine, puoi usare coroutine.create() seguita 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 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 in esecuzione non può essere chiusa.Una coroutine non può essere ripresa dopo essere stata chiusa.

Parametri

Restituzioni

true a meno che la coroutine che viene chiusa si trovi in uno stato di errore.

Variant<string, ()>

Il Messaggiodi errore, se presente.

create

Crea una nuova coroutine, con il corpo f. f deve essere una funzione Luau.

Parametri

Restituzioni

isyieldable

Restituisce true se la coroutine questa funzione viene chiamata all'interno può produrre in sicurezza.Cedere una coroutine all'interno di metodi o funzioni C è vietato, ad eccezione di pcall e xpcall .

Restituzioni

Se la coroutine può o meno produrre in sicurezza a questo punto.

resume

Avvia o continua l'esecuzione della coroutine co .La prima volta che riprendi una coroutine, inizia a eseguire il suo corpo.I valori ... vengono passati come argomenti alla funzione del corpo.Se la coroutine ha ceduto, riprendila; i valori ... sono passati come risultati dalla cessione.Se la coroutine si esegue senza errori, riprendi i ritorni veri più qualsiasi valore passato a yield (se la coroutine yield) o qualsiasi valore restituito dalla funzione del corpo (se la coroutine termina).Se c'è qualsiasi errore, riprendi i ritorni falsi più il Messaggiodi errore.

Parametri

...: Variant

Restituzioni

running

Restituisce la coroutine in esecuzione.

Restituzioni

status

Restituisce lo stato della coroutine co, come Stringa: 'in esecuzione', se la coroutine è in esecuzione (cioè, ha chiamato lo Stato); 'sospesa', se la coroutine è sospesa in una chiamata a yield, o se non è ancora in esecuzione; 'normale' se la coroutine è attiva ma non è ancora in esecuzione (cioè, ha ripreso un'altra coroutine); e 'morta' se la coroutine ha finito la sua funzione corporea, o se è stata interrotta con un errore.

Parametri

Restituzioni

Crea una nuova coroutine, con il corpo f.f deve essere una funzione Luau.Restituisce una funzione che riprende la coroutine ogni volta che viene chiamata.Qualsiasi argomento passato alla funzione si comporta come gli argomenti extra da riprendere.Restituisce gli stessi valori restituiti da ripresa, 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 da restituire vengono passati come risultati supplementari da riprendere.Cedere una coroutine all'interno di metodi o funzioni C è vietato, ad eccezione di pcall e xpcall .

Parametri

...: Tuple

Restituzioni

Tuple<Variant>