coroutine
*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.
Eine Koroutine wird verwendet, um mehrere Aufgaben gleichzeitig aus demselben Skript, das. PL: die Skriptsauszuführen.Solche Aufgaben könnten die Erzeugung von Werten aus Eingaben oder die Arbeit an einer Unterroutine beinhalten, wenn ein größeres Problem gelöst wird.Eine Aufgabe muss nicht einmal einen definierten Endpunkt haben, aber sie muss bestimmte Zeiten definieren, zu denen sie geben (pausieren) kann, damit andere Dinge bearbeitet werden können.
Verwendung von Coroutinen
Eine neue Koroutine kann erstellt werden, indem eine Funktion bereitgestellt wird, um coroutine.create() .Sobald er erstellt wurde, beginnt eine Koroutine nicht zu laufen, bis die erste Anruf an coroutine.resume(), der die Argumente an die Funktion übermittelt, erfolgt.Dieser Aufruf wird zurückgegeben, wenn die Funktion entweder stoppt oder coroutine.yield() anruft, und wenn dies geschieht, gibt coroutine.resume() entweder die von der Funktion zurückgegebenen Werte, die an coroutine.yield() gesendeten Werte oder eine Nachrichtzurück.Wenn es einen Fehler gibt, ist der zweite Rückgabewert der geworfene Fehler.
local function task(...)
-- Diese Funktion könnte ein bisschen Arbeit für ein bisschen tun und dann einen Wert abgeben
coroutine.yield("first") -- Von coroutine.resume() zurückzugeben
-- Die Funktion wird fortgesetzt, sobald sie wieder aufgenommen wird
return "second"
end
local taskCoro = coroutine.create(task)
-- Rufen Sie zum ersten Mal die Wiederaufnahme des Aufrufs auf, die die Funktion von Anfang an ausführt
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> true, zuerst (aufgabe namens coroutine.yield()} aufgerufen)
-- Führe die Funktion weiter aus, bis sie aufgibt 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 kannst du coroutine.status() anrufen, um ihren Status zu überprüfen:
<th>Bedeutung</th></tr></thead><tbody><tr><td><b>gesperrt</b></td><td>Die Koroutine wartet darauf, wieder aufgenommen zu werden. Korroutinen beginnen in diesem Zustand und treten 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 Koroutine wartet auf die Ausgabe einer anderen Koroutine; mit anderen Worten, sie hat eine andere Koroutine wieder aufgenommen.</td></tr><tr><td><b>tot</b></td><td>Die Funktion wurde unterbrochen (returned oder thrown einen Fehler). Die Koroutine kann nicht weiter verwendet werden.</td></tr></tbody>
Status |
---|
Coroutinen einpacken
Wenn Sie mit Coroutinen arbeiten, können Sie auch die Verwendung des Coroutine-Objekts vermeiden und stattdessen eine Wrapper-Funktion verwenden.Eine solche Wrapper-Funktion wird eine bestimmte Koroutine fortsetzen, wenn sie aufgerufen wird, und wird nur die übergebenen Werte zurückgeben.Du kannst dies mit coroutine.wrap() tun:
-- Erstelle eine Koroutine und gib eine Wrapper-Funktion zurück, die sie fortsetztlocal f = coroutine.wrap(task)-- Fortsetzen der Coroutine, als ob wir coroutine.resume() aufgerufen hättenlocal result = f()-- Wenn ein Fehler auftritt, wird er hier angezeigt!-- This differs from coroutine.resume() which acts similar to pcall()
Der erste Wert, der von coroutine.resume() zurückgegeben wird, beschreibt, ob eine Koroutine ohne Fehler ausgeführt wurde.Funktionen, die von coroutine.wrap() zurückgegeben werden, tun dies jedoch nicht: stattdessen geben sie die zurückgegebenen oder übergebenen Werte direkt an coroutine.yield() zurück, wenn vorhanden.Sollte ein Fehler während der Ausführung der Koroutinefunktion aufgetreten sein, wird der Fehler auf dem Aufruf der zurückgegebenen Funktion erhoben.
Beispiel für Produzentenmuster
Stell dir eine Aufgabe vor, die Wiederholungen eines Wortes erzeugt: jedes Mal, wenn sie eine Wiederholung erzeugt, wird die nächste mehr produzieren.Zum Beispiel wird die Bereitstellung von Hello produzieren Hello , HelloHello , HelloHelloHello usw.Um dies zu tun, können Sie repeatThis() definieren:
-- Diese Funktion wiederholt ein Wort jedes Mal, wenn seine Koroutine wieder aufgenommen wird
local function repeatThis(word)
local repetition = ""
while true do
-- Machen Sie eine Wiederholung und geben Sie dann das Ergebnis aus
repetition = repetition .. word
coroutine.yield(repetition)
end
end
Um diese Funktion als Koroutine auszuführen, kannst du coroutine.create() verwenden, gefolgt von mehreren Anrufen bei coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- echt, Halloprint(coroutine.resume(repetitionCoro)) -- echt, HelloHelloprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
Für diese Produzentenfunktion kannst du auch coroutine.wrap() verwenden, um eine Funktion zu erhalten, die Werte produziert:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- Halloprint(f()) -- HalloHelloprint(f()) -- HelloHelloHello
Zusammenfassung
Funktionen
Schließt und bringt die bereitgestellte Koroutine in einen toten Zustand.
Erstellt eine neue Koroutine, mit Körper f. f muss eine Luau-Funktion sein.
Gibt true zurück, wenn die Koroutine diese Funktion innerhalb sicher aufrufen kann.
Startet oder führt die Ausführung von Coroutine co fort.
Gibt die laufende Koroutine zurück.
Gibt den Status von Coroutine-Co als String zurück.
Erstellt eine neue Koroutine und gibt eine Funktion zurück, die, wenn sie aufgerufen wird, die Koroutine wieder aufnimmt.
Suspendiert die Ausführung der Coroutine.
Funktionen
close
Schließt und bringt die bereitgestellte Koroutine in einen toten Zustand.Diese Funktion gibt true zurück, es sei denn, die Koroutine befindet sich in einem Fehlzustand, in dem sie false und die Nachrichtzurückgibt.Eine Koroutine, die derzeit läuft, kann nicht geschlossen werden.Eine Koroutine kann nicht fortgesetzt werden, nachdem sie geschlossen wurde.
Parameter
isyieldable
Gibt true zurück, wenn die Koroutine diese Funktion innerhalb sicher aufrufen kann.Die Aufgabe einer Koroutine innerhalb von Metamethoden oder C-Funktionen ist verboten, mit Ausnahme von pcall und xpcall.
Rückgaben
Ob die Koroutine zu diesem Zeitpunkt sicher ausgegeben werden kann oder nicht.
resume
Startet oder führt die Ausführung von Coroutine co fort.Das erste Mal, wenn du eine Koroutine wieder aufnimmst, beginnt sie ihren Körper auszuführen.Die Werte ... werden als Argumente an die Körperfunktion übergeben.Wenn die Koroutine aufgegeben hat, führe sie wieder neu auf; die Werte ... werden als Ergebnisse der Übergabe übergeben.Wenn die Koroutine ohne Fehler ausgeführt wird, wird die Fortsetzung Rückgaben wahr plus alle Werte, die an die Yield übergeben wurden (wenn die Koroutine Yield ausgibt), oder alle Werte, die von der Körperfunktion zurückgegeben wurden (wenn die Koroutine endet), fortsetzen.Wenn es einen Fehler gibt, werden Fortsetzungen mit falsch plus der Nachrichtzurückgegeben.
Parameter
status
Gibt den Status der Coroutine co als String zurück: 'läuft', wenn die Coroutine läuft (das heißt, sie hat den Status aufgerufen); 'ausgesperrt', wenn die Coroutine in einer Anrufablage unterbrochen wird; 'nicht gestartet', wenn die Coroutine noch nicht startet; und 'normal', wenn die Coroutine aktiv ist, aber noch nicht läuft (das heißt, sie hat eine andere Coroutine wieder aufgenommen); und 'tot', wenn die Coroutine ihren Körperfunktion abgeschlossen hat oder wenn sie mit einem Fehler aufgehört hat.
Parameter
Rückgaben
wrap
Erstellt eine neue Koroutine, mit Körper f.f muss eine Luau-Funktion sein.Gibt eine Funktion zurück, die die Koroutine jedes Mal neu startet, wenn sie aufgerufen wird.Alle Argumente, die an die Funktion übergeben werden, verhalten sich wie die zusätzlichen Argumente, um fortzufahren.Gibt die gleichen Werte zurück, die von der Wiederaufnahme zurückgegeben wurden, mit Ausnahme des ersten booleschen.Im Falle eines Fehlers verbreitet der Fehler.
Parameter
Rückgaben
yield
Suspendiert die Ausführung der aufrufenden Koroutine.Alle Argumente, die bereitgestellt werden sollen, werden als zusätzliche Ergebnisse zum Fortsetzen übergeben.Die Aufgabe einer Koroutine innerhalb von Metamethoden oder C-Funktionen ist verboten, mit Ausnahme von pcall und xpcall.