Pausieren mit coroutine.yield()
Teil des Abschnitts Logik & Programmablauf der Lua-Journey von Coddy — Lektion 50 von 54.
coroutine.yield(). Das ist es, was es einer Coroutine ermöglicht, sich mitten in der Ausführung selbst zu pausieren und die Kontrolle an den Code zurückzugeben, der sie fortgesetzt hat.Wenn eine Coroutine coroutine.yield() aufruft, hält sie an genau diesem Punkt sofort an. Das nächste Mal, wenn Sie coroutine.resume() für diese Coroutine aufrufen, wird sie direkt nach dem yield()-Aufruf fortgesetzt, als wäre nichts gewesen.Hier ist ein einfaches Beispiel:function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- Gibt "One" aus, dann pausiert
coroutine.resume(co) -- Gibt "Two" aus, dann pausiert
coroutine.resume(co) -- Gibt "Three" aus, dann beendetresume()-Aufruf die Coroutine ausführt, bis sie auf ein yield() trifft. Die Coroutine merkt sich genau, wo sie angehalten hat, einschließlich aller ihrer lokalen Variablen und ihres Ausführungsstatus.Sie können auch Werte zurückgeben, wenn Sie yielden. Alle Argumente, die Sie coroutine.yield() übergeben, werden zu Rückgabewerten von coroutine.resume(). Beachten Sie, dass coroutine.resume() als ersten Wert immer einen booleschen status zurückgibt (true, wenn die Coroutine ohne Fehler ausgeführt wurde, oder false, wenn ein Fehler aufgetreten ist), gefolgt von allen Werten, die an yield() übergeben wurden:function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
-- status ist true, value ist 10
local status, value = coroutine.resume(co)
print(value) -- Gibt aus: 10
-- status ist true, value ist 20
status, value = coroutine.resume(co)
print(value) -- Gibt aus: 20Aufgabe
EinfachSchreiben Sie eine Funktion createYieldingCoroutine, die count entgegennimmt und einen String zurückgibt, der die Ausgabe einer Coroutine zeigt, die mehrmals Werte liefert (yields).
Erstellen Sie eine Coroutine, die für jeden Schritt von 1 bis count den String "Step X" liefert, insgesamt für count Schritte. Führen Sie die Coroutine count-mal mit resume aus, um alle gelieferten Werte zu sammeln. Geben Sie alle gelieferten Werte zurück, getrennt durch Zeilenumbrüche.
Logik:
- Erstellen Sie eine Funktion, die eine Schleife verwendet, um
"Step 1","Step 2"usw. biscountmittelsyieldzurückzugeben - Nach allen Yields sollte die Funktion enden (kein finales Yield für "Done")
- Hüllen Sie diese Funktion mit
coroutine.create()in eine Coroutine ein - Rufen Sie
resumefür die Coroutinecount-mal auf und sammeln Sie jeden gelieferten Wert - Verknüpfen Sie alle gelieferten Werte mit Zeilenumbrüchen dazwischen
- Geben Sie den verknüpften String zurück
Parameter:
count(Zahl): Die Anzahl der auszuführenden Yield-Schritte
Rückgabe: Ein String, der alle gelieferten Werte getrennt durch Zeilenumbrüche enthält (string). Format: Step 1\nStep 2\nStep 3
Probier es selbst
function createYieldingCoroutine(count)
-- Schreibe hier den Code
end
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmablauf
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