resume & yield
Teil des Abschnitts Logik & Programmablauf der Lua-Journey von Coddy — Lektion 51 von 54.
In der vorherigen Lektion haben Sie gelernt, wie eine coroutine Werte mit coroutine.yield() an den Hauptcode zurückgeben kann. Die Kommunikation kann jedoch in beide Richtungen fließen. Sie können auch Werte into eine coroutine senden, wenn Sie sie mit resume fortsetzen.
Wenn Sie coroutine.resume() mit zusätzlichen Argumenten nach dem Coroutine-Objekt aufrufen, werden diese Argumente in 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" in die CoroutineWenn die coroutine das zweite Mal fortgesetzt wird, wird der String "Hello" übergeben und wird zum Rückgabewert von coroutine.yield(), der in der Variable value gespeichert wird.
Aufgabe
EinfachSchreiben Sie eine Funktion createEchoCoroutine, die initialMessage entgegennimmt und einen String zurückgibt, der die Zwei-Wege-Kommunikation zwischen dem Hauptcode und einer Coroutine zeigt.
Erstellen Sie eine Coroutine, die zuerst die initialMessage mit yield zurückgibt, dann eine Antwort beim Fortsetzen (resume) empfängt und schließlich diese Antwort mit yield zurückgibt. Die Funktion soll das Übergeben von Werten sowohl aus der Coroutine heraus als auch in die Coroutine hinein demonstrieren.
Logik:
- Erstellen Sie eine Funktion, die
initialMessagemittelsyieldzurückgibt und den Rückgabewert dieses Yields speichert - Nachdem der Wert empfangen wurde, geben Sie ihn erneut mittels
yieldzurück - Hüllen Sie diese Funktion unter Verwendung von
coroutine.create()in eine Coroutine ein - Setzen Sie die Coroutine das erste Mal fort, um die anfängliche Nachricht zu erhalten
- Setzen Sie die Coroutine ein zweites Mal fort und übergeben Sie
"Response" - Fangen Sie den Wert ab, der beim zweiten Fortsetzen zurückgegeben wurde
- Geben Sie einen String im folgenden Format zurück:
First: [first_yield]\nSecond: [second_yield]
Parameter:
initialMessage(string): Die Nachricht, die die Coroutine zuerst mityieldzurückgibt
Rückgabe: Ein String, der beide geforderten Werte durch einen Zeilenumbruch getrennt anzeigt (string). 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 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