Menu
Coddy logo textTech

Pausieren mit coroutine.yield()

Teil des Abschnitts Logik & Programmablauf der Lua-Journey von Coddy. Lektion 50 von 54.

Die wahre Leistungsfähigkeit von Coroutinen ergibt sich aus der Funktion 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 beendet
Beachte, dass jeder Aufruf von resume() 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: 20
challenge icon

Aufgabe

Einfach

Schreibe 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ßlich count zu 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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Programmablauf

Übe selbstständig: Online-Lua-Compiler