resume & yield
Teil des Abschnitts Logic & Flow der Lua-Journey von Coddy — Lektion 51 von 54.
In der vorherigen Lektion haben Sie gelernt, wie eine Coroutine mithilfe von coroutine.yield() Werte an den Hauptcode zurückgeben kann. Aber die Kommunikation kann in beide Richtungen fließen. Sie können auch Werte in eine Coroutine senden, wenn Sie diese fortsetzen.
Wenn Sie coroutine.resume() mit zusätzlichen Argumenten nach dem Coroutine-Objekt aufrufen, werden diese Argumente an die Coroutine übergeben. Innerhalb der Coroutine werden diese Werte zu den Rückgabewerten des coroutine.yield()-Aufrufs, 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" an die CoroutineWenn die Coroutine zum zweiten Mal fortgesetzt wird, wird der String "Hello" übergeben und zum Rückgabewert von coroutine.yield(), welcher in der Variable value gespeichert wird.
Aufgabe
EinfachSchreiben Sie eine Funktion createEchoCoroutine, die initialMessage entgegennimmt und einen String zurückgibt, der die bidirektionale Kommunikation zwischen dem Hauptcode und einer Coroutine zeigt.
Erstellen Sie eine Coroutine, die zuerst die initialMessage mittels yield zurückgibt, dann bei der Fortsetzung eine Antwort empfängt und schließlich diese Antwort erneut mittels yield zurückgibt. Die Funktion soll demonstrieren, wie Werte sowohl aus der Coroutine heraus als auch in die Coroutine hinein übergeben werden.
Logik:
- Erstellen Sie eine Funktion, die
initialMessagemittels yield zurückgibt und den Rückgabewert dieses Yields speichert - Nachdem der Wert empfangen wurde, geben Sie ihn erneut mittels yield zurück
- Umschließen Sie diese Funktion mit
coroutine.create()in einer Coroutine - Setzen Sie die Coroutine zum ersten Mal fort, um die initiale Nachricht zu erhalten
- Setzen Sie die Coroutine ein zweites Mal fort und übergeben Sie dabei
"Response" - Erfassen Sie den Wert, der beim zweiten Fortsetzen (resume) zurückgegeben wurde
- Geben Sie einen String im folgenden Format zurück:
First: [first_yield]\nSecond: [second_yield]
Parameter:
initialMessage(string): Die Nachricht, welche die Coroutine zuerst mittels yield zurückgibt
Rückgabewert: Ein String, der beide Yield-Werte getrennt durch einen Zeilenumbruch anzeigt (string). Format: First: Hello\nSecond: Response
Spickzettel
Sie können Werte an eine Coroutine senden, wenn Sie diese fortsetzen, indem Sie zusätzliche Argumente an coroutine.resume() übergeben. Diese Argumente werden zu den Rückgabewerten des coroutine.yield()-Aufrufs, der die Coroutine pausiert hat.
function receiver()
local value = coroutine.yield() -- Pausiert und wartet auf Eingabe
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Startet die Coroutine, pausiert bei yield
coroutine.resume(co, "Hello") -- Übergibt "Hello" an die CoroutineWenn die Coroutine das zweite Mal fortgesetzt wird, wird "Hello" übergeben und wird zum Rückgabewert von coroutine.yield(), der in der Variable value gespeichert wird.
Probier es selbst
function createEchoCoroutine(initialMessage)
-- 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-Tabelle