coroutine
*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.
Eine Coroutine wird verwendet, um mehrere Aufgaben gleichzeitig aus dem selben Skript, das. PL: die Skriptsauszuführen. Solche Aufgaben können die Produktion von Werte aus Eingaben oder die Ausführung von Arbeit auf einer Subroutine umfassen, wenn ein größeres Problem gelöst wird. Ein Task muss nicht ein bestimmtes Endpunkt haben, aber er muss einen bestimmten Zeitpunkt definieren, zu dem er wird (暂停) ausgeführt, um andere Dinge zu arbeiten.
Verwendung von Coroutines
Eine neue Koroutine kann erstellt werden, indem eine Funktion zu coroutine.create() bereitgestellt wird. Nachdem eine Koroutine erstellt wurde, beginnt eine Koroutine nicht zu laufen, bis
local function task(...)
-- Diese Funktion kann ein wenig Arbeit für einige Arbeit erledigen und dann einen Wert liefern
coroutine.yield("first") -- Zurückgegeben von coroutine.resume()
-- Die Funktion wird wieder aufgenommen, sobald sie wieder aufgenommen wird
return "second"
end
local taskCoro = coroutine.create(task)
-- Rufen Sie zum ersten Mal die Rückruf funktion auf, die die Funktion vom Anfang an ausführt
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> true, first (task namens coroutine.yield()}
-- Führen Sie die Funktion weiter aus, bis sie entweder läuft oder angehalten wird
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
Während der Lebensdauer der Coroutine können Sie coroutine.status() aufrufen, um seinen Statuszu überprüfen:
<tbody><tr><td><b>gefederte</b></td> <td>Die Coroutine wartet darauf, wieder aufgenommen zu werden. Coroutines beginnen in diesem Zustand und geben sie ein, wenn ihre Funktion <code>coroutine.yield()</code> aufruft.</td></tr><tr><td><b>läuft</b></td><td>Die Koroutine läuft gerade.</td></tr><tr><td><b>normal</b></td> <td>Die Coroutine wartet auf die Ausgabe einer anderen Coroutine; mit anderen Worten, sie hat eine andere Coroutine wieder aufgenommen.</td></tr><tr><td><b>tot</b></td> <td>Die Funktion wurde angehalten (Fehler zurückgegeben oder Fehler geworfen). Die Coroutine kann nicht weiter verwendet werden.</td></tr></tbody>
Status | Bedeutung |
---|
Wrap-Koroutinen
Wenn Sie mit Coroutinen arbeiten, können Sie auch die Verwendung des Coroutine-Objekts verlassen und stattdessen eine Wrap-Funktion verwenden. Eine solche Wrap-Funktion wird eine bestimmte Coroutine wieder aufrufen und nur die produzierten Werte zurückgeben. Sie können dies mit coroutine.wrap() tun:
-- Erstellen Sie eine Coroutine und geben Sie eine Wrap-Funktion zurück, die sie wieder aufruftlocal f = coroutine.wrap(task)-- Fassen Sie die Coroutine zusammen, als ob wir coroutine.resume() aufrufenlocal result = f()-- Wenn ein Fehler auftritt, wird er hier aufgeführt!-- This differs from coroutine.resume() which acts similar to pcall()
Der erste Wert, der von coroutine.resume() beschreibt, ob eine Coroutine ohne Fehler ausgeführt wird. Funktionen, die von coroutine.wrap() zurückgegeben werden, werden dies jedoch nicht tun: Stattdessen geben sie die zurückgegebenen Werte oder die übergegebenen Werte direkt an coroutine.yield() zurück, wenn vorhanden. Wenn ein
Beispiel für Produzentenmuster
Stellen Sie sich eine Aufgabe vor, die Wiederholungen eines Wortes erstellt: Jedes Mal, wenn es eine Wiederholung erstellt, produziert die nächste, um eine weitere zu erzeugen. Zum Beispiel, wenn Sie Hello bereitstellen, wird Hello , HelloHello , 1> HelloHelloHello1> , usw. Um dies zu tun, können Sie definieren
-- Diese Funktion wiederholt ein Wort jedes Mal, wenn seine Routine wieder aufgenommen wird
local function repeatThis(word)
local repetition = ""
while true do
-- Mach eine Wiederholung und dann das Ergebnis liefern
repetition = repetition .. word
coroutine.yield(repetition)
end
end
Um diese Funktion als Routine auszuführen, können Sie coroutine.create() gefolgt von mehreren Aufrufen zu coroutine.resume() verwenden:
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- Helloprint(coroutine.resume(repetitionCoro)) -- ja, HelloHelloprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
Für diese Produzentenfunktion können Sie auch coroutine.wrap() verwenden, um eine Funktion zu erhalten, die Werte produziert:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- Halloprint(f()) -- HalloHalloprint(f()) -- HelloHelloHello
Zusammenfassung
Funktionen
Schließt die angegebene Coroutine in einen Dead-Status.
Erstellt eine neue Coroutine, mit body f. muss eine Lua-Funktion sein.
Gibt true zurück, wenn die Routine diese Funktion innerhalb von sicherem Umfeld aufruft.
Startet oder fortsetzt die Ausführung von coroutine co .
Rückgibt die laufende Koroutine.
Rückgibt den Status von coroutine co als String zurück.
Erstellt eine neue Coroutine und gibt eine Funktion zurück, die, wenn aufgerufen, die Coroutine wieder aufruft.
Suspendiert die Ausführung der Coroutine.
Funktionen
close
Schließt und setzt die angegebene Coroutine in einen Dead-Status. Diese Funktion gibt true zurück, es sei denn, die Coroutine befindet sich in einem Fehlerzustand, in dem sie false und die Fehler-Nachricht zurückgibt. Eine Coroutine, die derzeit ausgeführt wird, kann nicht geschlossen werden. Eine Coroutine kann nach dem Schließen nicht wieder aufgenommen werden.
Parameter
isyieldable
Gibt true zurück, wenn die Coroutine diese Funktion innerhalb von sicherem Umfang aufruft. Das Auslösen einer Coroutine innerhalb von Metamethods oder C-Funktionen ist verboten, mit Ausnahme von pcall und xpcall.
Rückgaben
Ob die Coroutine diesen Zeitpunkt sicher liefern kann oder nicht.
resume
Startet oder führt die Ausführung von coroutine co . Wenn Sie eine Coroutine wieder aufnehmen, beginnt sie mit der Ausführung ihres Körpers. Die ersten Zeichen ... werden als Argumente an die Nachrichtübergeben. Wenn die Coroutine ohne Feh
Parameter
status
Gibt den Status von coroutine co, als String zurück: 'running', wenn die Coroutine läuft (d. h. sie den Status anruft); 'uspended', wenn die Coroutine in einem Aufruf zu Yield ausgeführt wird, oder wenn sie noch nicht Yield aufgeführt hat; 'normal' wenn die Coroutine aktiv ist, aber nicht Yield aufgeführt wird; und 'dead' wenn die Coroutine mit einem Fehler beendet ist.
Parameter
Rückgaben
wrap
Erstellt eine neue Routine, mit body f. muss eine Lua-Funktion sein. Wird eine Funktion zurückgegeben, die die Routine jedes Mal wieder aufruft. Alle Argumente, die dem Funktionsbereich übergeben werden, verhalten sich als zusätzliche Argumente, um die Routine wieder aufzunehmen. Wird ein falscher Wert zurückgegeben, behandelt die Routine wie die ersten Argumente, die zurückgegeben werden.
Parameter
Rückgaben
yield
Suspendiert die Ausführung der aufrufenden Coroutine. Alle Argumente, die als zusätzliche Ergebnisse ausgegeben werden, werden als zusätzliche Ergebnisse zurückgegeben. Das Übergeben einer Coroutine innerhalb von Metam Methods oder C-Funktionen ist verboten, mit Ausnahme von pcall und xpcall.