Fortsetzen & yield
Teil des Abschnitts Logik & Programmablauf der Lua-Journey von Coddy. Lektion 51 von 54.
In der vorherigen Lektion hast du gelernt, wie eine Coroutine mithilfe von coroutine.yield() Werte an den Hauptcode zurückgeben kann. Aber die Kommunikation kann in beide Richtungen fließen. Du kannst auch Werte in eine Coroutine senden, wenn du sie fortsetzt.
Wenn du coroutine.resume() mit zusätzlichen Argumenten nach dem Coroutine-Objekt aufrufst, werden diese Argumente an die Coroutine übergeben. Innerhalb der Coroutine werden diese Werte zu den Rückgabewerten des Aufrufs coroutine.yield(), der sie pausiert hat.
So funktioniert es:
function receiver()
print("Coroutine started")
local value = coroutine.yield()
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Startet und pausiert bei yield
coroutine.resume(co, "Hello") -- Übergibt "Hello" in die CoroutineWenn die Coroutine zum zweiten Mal fortgesetzt wird, wird die Zeichenkette "Hello" übergeben und wird zum Rückgabewert von coroutine.yield(), der in der Variablen value gespeichert wird.
Aufgabe
EinfachSchreibe eine Funktion createEchoCoroutine, die initialMessage übernimmt und eine Zeichenkette zurückgibt, die die Kommunikation in beide Richtungen zwischen dem Hauptcode und einer Coroutine zeigt.
Erstelle eine Coroutine, die zuerst initialMessage zurückgibt, beim Fortsetzen eine Antwort empfängt und diese Antwort schließlich wieder zurückgibt. Die Funktion soll das Übergeben von Werten sowohl aus der Coroutine heraus als auch in die Coroutine hinein demonstrieren.
Logik:
- Erstelle eine Funktion, die
initialMessagezurückgibt und den Rückgabewert dieses Vorgangs speichert - Gib den Wert nach dem Empfangen wieder zurück
- Verpacke diese Funktion mithilfe von
coroutine.create()in eine Coroutine - Setze die Coroutine zum ersten Mal fort, um die Anfangsnachricht zu erhalten
- Setze die Coroutine ein zweites Mal fort und übergib dabei
"Response" - Speichere den Wert, der beim zweiten Fortsetzen zurückgegeben wird
- Gib eine Zeichenkette im folgenden Format zurück:
First: [first_yield]\nSecond: [second_yield]
Parameter:
initialMessage(Zeichenkette): Die Nachricht, die die Coroutine zuerst zurückgibt
Rückgabe: Eine Zeichenkette, die beide zurückgegebenen Werte durch einen Zeilenumbruch getrennt zeigt (Zeichenkette). Format: First: Hello\nSecond: Response
Probier es selbst
function createEchoCoroutine(initialMessage)
-- Schreibe hier 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