Coroutine-Status prüfen
Teil des Abschnitts Logic & Flow der Lua-Journey von Coddy — Lektion 52 von 54.
Wenn Sie mit Coroutinen arbeiten, müssen Sie oft wissen, in welchem Zustand sich eine Coroutine befindet. Läuft sie gerade? Ist sie pausiert und wartet darauf, fortgesetzt zu werden? Ist ihre Ausführung beendet?
Lua stellt die Funktion coroutine.status() bereit, um diese Fragen zu beantworten.
Die Funktion coroutine.status() nimmt eine Coroutine als Argument entgegen und gibt einen String zurück, der ihren aktuellen Zustand beschreibt. Es gibt drei mögliche Zustände:
| "suspended" | Die Coroutine ist bei einem yield() pausiert und kann fortgesetzt werden |
| "running" | Die Coroutine wird gerade ausgeführt |
| "dead" | Die Coroutine hat die Ausführung beendet und kann nicht erneut fortgesetzt werden |
So wird es verwendet:
function task()
coroutine.yield()
print("Finishing")
end
local co = coroutine.create(task)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "suspended" (pausiert bei yield)
coroutine.resume(co)
print(coroutine.status(co)) -- "dead" (beendet)Aufgabe
EinfachSchreiben Sie eine Funktion checkCoroutineLifecycle, die resumeCount entgegennimmt und einen String zurückgibt, der den Status einer Coroutine an verschiedenen Punkten ihres Lebenszyklus anzeigt.
Erstellen Sie eine Coroutine, die einmal nachgibt (yield) und dann abgeschlossen wird. Überprüfen und protokollieren Sie ihren Status nach der Erstellung, nach dem ersten Fortsetzen (wenn sie bei yield pausiert ist) und nach weiteren Fortsetzungen basierend auf resumeCount.
Logik:
- Erstellen Sie eine Funktion, die den String
"paused"einmal mit yield zurückgibt und dann abgeschlossen wird - Verpacken Sie diese Funktion mit
coroutine.create()in eine Coroutine - Überprüfen Sie den Status unmittelbar nach der Erstellung mit
coroutine.status() - Setzen Sie die Coroutine einmal fort und überprüfen Sie ihren Status erneut
- Setzen Sie die Coroutine weitere Male fort, basierend auf
resumeCount - 1(Gesamtzahl der Fortsetzungen = resumeCount) - Überprüfen Sie den finalen Status nach allen Fortsetzungen
- Geben Sie einen String mit allen drei Statuswerten im folgenden Format zurück:
initial: [status]\\nafter first resume: [status]\\nfinal: [status]
Parameter:
resumeCount(number): Gesamtzahl der Wiederaufnahmen der Coroutine (Minimum 1)
Rückgabewert: Ein String, der den Coroutine-Status an drei Punkten seines Lebenszyklus anzeigt (string). Format: initial: suspended\nafter first resume: suspended\nfinal: dead
Spickzettel
Die Funktion coroutine.status() gibt den aktuellen Zustand einer Coroutine als String zurück.
Mögliche Zustände:
"suspended"- Die Coroutine ist bei einemyield()pausiert und kann fortgesetzt werden"running"- Die Coroutine wird derzeit ausgeführt"dead"- Die Coroutine hat die Ausführung beendet und kann nicht fortgesetzt werden
Verwendung:
coroutine.status(coroutine_object)Beispiel:
function task()
coroutine.yield()
print("Finishing")
end
local co = coroutine.create(task)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "dead"Probier es selbst
function checkCoroutineLifecycle(resumeCount)
-- Code hier schreiben
end
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Fortgeschrittene Table-Iteration
Iterieren mit pairs()Iterieren mit ipairs()pairs() vs. ipairs()Zusammenfassung – Charakterbogen4Einführung in Metatables
Was ist eine Metatable?setmetatable & getmetatableDie __index-MetamethodeDie __newindex-MetamethodeDie __tostring-MetamethodeArithmetische Metamethoden Teil 1Arithmetische Metamethoden Teil 2Zusammenfassung – Schreibgeschützte Tabellen7Fortgeschrittene String-Manipulation
string.gsub() für ErsetzungenEinführung in String-Patternsstring.find()string.match()Iterieren mit string.gmatch()Rückblick – Log-File-Parser2Weitere Funktionen der Table-Bibliothek
table.concat()Tabellenerstellung & unpack()table.sort()Benutzerdefiniertes Sortieren mit FunktionenRückblick – Highscore-Tabelle3Fortgeschrittene Funktionskonzepte
Mehrere RückgabewerteVariadische Funktionen (...)Funktionen als First-Class ValuesAnonyme FunktionenWas ist eine Closure?Zusammenfassung – Einfacher Event Handler6Fehlerbehandlung
Die error()-FunktionGeschützte Aufrufe mit pcall()Zusammenfassung – Sichere Division9Coroutines für Anfänger
Was ist eine Coroutine?coroutine create & resumePausieren mit coroutine.yield()resume & yieldCoroutine-Status prüfenWiederholung – ZahlengeneratorWiederholung – Vektormathematik