Menu
Coddy logo textTech

Pausieren mit coroutine.yield()

Teil des Abschnitts Logic & Flow der Lua-Journey von Coddy — Lektion 50 von 54.

Die wahre Stärke von Coroutines liegt in der coroutine.yield()-Funktion. Dies ermöglicht es einer Coroutine, sich mitten in der Ausführung selbst zu pausieren und die Kontrolle an den Code zurückzugeben, der sie fortgesetzt hat.

Wenn eine Coroutine coroutine.yield() aufruft, stoppt sie sofort an genau diesem Punkt. Wenn Sie das nächste Mal coroutine.resume() für diese Coroutine aufrufen, wird sie direkt nach dem yield()-Aufruf fortgesetzt, als ob nichts passiert wäre.

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, pausiert dann
coroutine.resume(co)  -- Gibt "Two" aus, pausiert dann
coroutine.resume(co)  -- Gibt "Three" aus, schließt dann ab

Beachten Sie, wie jeder resume()-Aufruf die Coroutine ausführt, bis sie auf ein yield() trifft. Die Coroutine merkt sich genau, wo sie angehalten hat, einschließlich aller ihrer lokalen Variablen und des Ausführungszustands.

Sie können beim Yielding auch Werte zurückgeben. Alle Argumente, die Sie an coroutine.yield() übergeben, werden zu den Rückgabewerten von coroutine.resume():

function giveNumbers()
    coroutine.yield(10)
    coroutine.yield(20)
end

local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value)  -- Gibt aus: 10

status, value = coroutine.resume(co)
print(value)  -- Gibt aus: 20
challenge icon

Aufgabe

Einfach

Schreiben Sie eine Funktion createYieldingCoroutine, die count entgegennimmt und einen String zurückgibt, der die Ausgabe einer Coroutine zeigt, die mehrmals Werte liefert (yields).

Erstellen Sie eine Coroutine, die für jeden Schritt von 1 bis count den String "Step X" liefert und dann "Done" ausgibt, wenn sie fertig ist. Setzen Sie die Coroutine count + 1 Mal fort, um alle gelieferten Werte und den finalen Abschluss zu erhalten. Geben Sie alle gelieferten Werte, verkettet mit Zeilenumbrüchen, zurück.

Logik:

  • Erstellen Sie eine Funktion, die eine Schleife verwendet, um "Step 1", "Step 2" usw. bis zu count zu liefern
  • Nach allen Yields sollte die Funktion abgeschlossen sein (kein finales Yield für "Done")
  • Hüllen Sie diese Funktion mit coroutine.create() in eine Coroutine ein
  • Setzen Sie die Coroutine count Mal fort und sammeln Sie jeden gelieferten Wert
  • Verketten Sie alle gelieferten Werte mit Zeilenumbruchzeichen dazwischen
  • Geben Sie den verketteten String zurück

Parameter:

  • count (number): Die Anzahl der zu liefernden Schritte

Rückgabewert: Ein String, der alle gelieferten Werte getrennt durch Zeilenumbrüche enthält (string). Format: Step 1\nStep 2\nStep 3

Spickzettel

Die Funktion coroutine.yield() ermöglicht es einer Coroutine, die Ausführung zu pausieren und die Kontrolle an den Aufrufer zurückzugeben. Wenn coroutine.resume() erneut aufgerufen wird, setzt die Coroutine direkt nach dem Aufruf von yield() fort.

Grundlegende Verwendung von coroutine.yield():

function countToThree()
    print("One")
    coroutine.yield()
    print("Two")
    coroutine.yield()
    print("Three")
end

local co = coroutine.create(countToThree)
coroutine.resume(co)  -- Gibt "One" aus, pausiert dann
coroutine.resume(co)  -- Gibt "Two" aus, pausiert dann
coroutine.resume(co)  -- Gibt "Three" aus, schließt dann ab

Werte mit coroutine.yield() übergeben:

function giveNumbers()
    coroutine.yield(10)
    coroutine.yield(20)
end

local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value)  -- Gibt aus: 10

status, value = coroutine.resume(co)
print(value)  -- Gibt aus: 20

Argumente, die an coroutine.yield() übergeben werden, werden zu den Rückgabewerten von coroutine.resume(). Die Coroutine bewahrt alle lokalen Variablen und den Ausführungszustand zwischen den Yields auf.

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 Logic & Flow