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

Parametri

Restituzioni

Variant<string, void>

create

Parametri

Restituzioni

isyieldable

Restituzioni

resume

Parametri

...: Variant

Restituzioni

Variant<Tuple, string>

running

Restituzioni

status

Parametri

Restituzioni

Parametri

Restituzioni

yield

Tuple<Variant>

Parametri

...: Tuple

Restituzioni

Tuple<Variant>