Pausieren mit coroutine.yield()
Teil des Abschnitts Logik & Programmablauf der Lua-Journey von Coddy. Lektion 50 von 54.
coroutine.yield(). Sie ermöglicht es einer Coroutine, sich mitten in der Ausführung zu pausieren und die Kontrolle an den Code zurückzugeben, der sie fortgesetzt hat.Wenn eine Coroutine coroutine.yield() aufruft, wird ihre Ausführung genau an diesem Punkt sofort angehalten. Wenn du das nächste Mal coroutine.resume() für diese Coroutine aufrufst, wird sie direkt nach dem Aufruf von yield() fortgesetzt, als wäre nichts geschehen.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() die Coroutine ausführt, bis sie auf ein yield() trifft. Die Coroutine merkt sich genau, wo sie angehalten wurde, einschließlich all ihrer lokalen Variablen und ihres Ausführungszustands.Du kannst beim Aussetzen auch Werte zurückgeben. Alle Argumente, die du an coroutine.yield() übergibst, werden zu den Rückgabewerten von coroutine.resume(). Beachte, dass coroutine.resume() immer als ersten Wert einen booleschen Status zurückgibt (true, wenn die Coroutine ohne Fehler ausgeführt wurde, oder false, wenn ein Fehler aufgetreten ist), gefolgt von allen an yield() übergebenen Werten: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
EinfachSchreibe eine Funktion createYieldingCoroutine, die count entgegennimmt und eine Zeichenfolge zurückgibt, die die Ausgabe einer Coroutine zeigt, die mehrmals Werte liefert.
Erstelle eine Coroutine, die für jeden Schritt von 1 bis count die Zeichenfolge "Step X" liefert, insgesamt also count Schritte. Setze die Coroutine count-mal fort, um alle gelieferten Werte zu sammeln. Gib alle gelieferten Werte zurück, verkettet mit Zeilenumbrüchen.
Logik:
- Erstelle eine Funktion, die eine Schleife verwendet, um
"Step 1","Step 2"usw. bis einschließlichcountzu liefern - Nach allen gelieferten Werten soll die Funktion abgeschlossen werden (kein abschließendes Liefern von „Done“)
- Verpacke diese Funktion mit
coroutine.create()in eine Coroutine - Setze die Coroutine
count-mal fort und sammle jeden gelieferten Wert - Verkette alle gelieferten Werte mit Zeilenumbruchzeichen zwischen ihnen
- Gib die verkettete Zeichenfolge zurück
Parameter:
count(number): Die Anzahl der zu liefernden Schritte
Rückgabe: Eine Zeichenfolge, die alle gelieferten Werte enthält, durch Zeilenumbrüche getrennt (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 Tabelleniteration
Iterieren mit pairs()Iterieren mit ipairs()pairs() vs. ipairs()Zusammenfassung – Charakterbogen2Weitere Funktionen der Tabellenbibliothek
table.concat()Tabellenkonstruktion & unpack()table.sort()Eigene Sortierung mit FunktionenRückblick – Highscore-Tabelle3Fortgeschrittene Funktionskonzepte
Mehrere Werte zurückgebenVariadische Funktionen (...)Funktionen als Werte erster KlasseAnonyme FunktionenWas ist eine Closure?Rückblick – Einfacher Event-Handler6Fehlerbehandlung
Die error()-FunktionGeschützte Aufrufe mit pcall()Zusammenfassung – Sichere Division9Coroutines für Einsteiger
Was ist eine Coroutine?Coroutine erstellen & fortsetzenPausieren mit coroutine.yield()Fortsetzen & yieldCoroutine-Status prüfenRückblick – ZahlengeneratorRückblick – VektorrechnungÜbe selbstständig: Online-Lua-Compiler