Godot: Rückgabewert von yield() implementieren

Erstellt am 19. Feb. 2015  ·  3Kommentare  ·  Quelle: godotengine/godot

Um Generatorfunktionen zu erstellen, müssen wir yield(value) implementieren. Dies würde sich wie yield() verhalten, aber 'value' würde zurückgereicht und vom Aufruf von resume() zurückgegeben.

Dies würde es ermöglichen, range() zu einem Iterator zu machen, anstatt ein potenziell riesiges Array zu erstellen.

Dies wäre auch ein Schritt in Richtung netter Features wie List/Dict Comprehension.

archived feature proposal gdscript

Hilfreichster Kommentar

Ich habe gerade angefangen, mit Godot zu arbeiten (bis jetzt gefällt es mir), aber ich stimme zu, dass yield() in der Lage sein sollte, mehr als den Funktionszustand zurückzugeben. Yield ist wie das Zurückgeben mit der Fähigkeit zum Resume(), also sollte die Funktion in der Lage sein, einen Wert durch Yield zurückzugeben.

Ein möglicher Ansatz, an den ich gedacht habe, ist die Erweiterung von [GDScript]FunctionState
( https://docs.godotengine.org/en/3.1/classes/class_gdscriptfunctionstate.html )
um eine Methode value() zu haben, die das Argument an yield() zurückgibt.

func co1():
     yield(5)

s = co1()
print(s.value())   # prints 5

GDscript hat bereits einen Yield, der zwei Werte annimmt und auf ein Signal wartet. Diese Version mit einem Argument würde jedoch nur ihr Argument im FunctionState zurückgeben. Mit nur dieser Änderung könnte ein Generator wie folgt geschrieben werden:

func xrange(count):
    var i = 0
    while i < count:
        yield(i)

func do_stuff():
    var it = xrange(5)
    while it:
        print(it.result())
        it = it.resume()

Das funktioniert ganz gut, aber es gibt eine Feinheit, die es wert ist, in Betracht gezogen zu werden. Wenn die Coroutine-Funktion zurückgibt (anstatt nachzugeben), wird ein Wert zurückgegeben, kein FunctionState. Im obigen Beispiel wird null zurückgegeben (weil die Funktion ungültig ist), was wir testen, um die Schleife in do_stuff() zu stoppen. Wenn die Coroutine-Funktion einen Wert zurückgibt [zB. Stellen Sie sich return false am Ende von xrange()] vor, dann würde dieser Test fehlschlagen.

Ich denke, ich werde mir den Code mal anschauen.
IMO, Ertrag (Wert) wäre, ähm, wertvoll.

BEARBEITEN: Beim Betrachten des Codes gibt es Komplikationen mit der Signalversion von yield, daher wird der Abschnitt, den ich unten darüber geschrieben habe, vorerst entfernt. Kann später näher ausgeführt werden.

Alle 3 Kommentare

Unangenehme Abhilfe:

func xrange(count, dict):
    var i = 0
    while i < count:
        dict.next = i
        yield()
        i += 1

func do_stuff():
    var curr = {}
    var it = xrange(5, curr)
    while curr.value != null:
        print(curr.value)
        it.resume()

Ich habe gerade angefangen, mit Godot zu arbeiten (bis jetzt gefällt es mir), aber ich stimme zu, dass yield() in der Lage sein sollte, mehr als den Funktionszustand zurückzugeben. Yield ist wie das Zurückgeben mit der Fähigkeit zum Resume(), also sollte die Funktion in der Lage sein, einen Wert durch Yield zurückzugeben.

Ein möglicher Ansatz, an den ich gedacht habe, ist die Erweiterung von [GDScript]FunctionState
( https://docs.godotengine.org/en/3.1/classes/class_gdscriptfunctionstate.html )
um eine Methode value() zu haben, die das Argument an yield() zurückgibt.

func co1():
     yield(5)

s = co1()
print(s.value())   # prints 5

GDscript hat bereits einen Yield, der zwei Werte annimmt und auf ein Signal wartet. Diese Version mit einem Argument würde jedoch nur ihr Argument im FunctionState zurückgeben. Mit nur dieser Änderung könnte ein Generator wie folgt geschrieben werden:

func xrange(count):
    var i = 0
    while i < count:
        yield(i)

func do_stuff():
    var it = xrange(5)
    while it:
        print(it.result())
        it = it.resume()

Das funktioniert ganz gut, aber es gibt eine Feinheit, die es wert ist, in Betracht gezogen zu werden. Wenn die Coroutine-Funktion zurückgibt (anstatt nachzugeben), wird ein Wert zurückgegeben, kein FunctionState. Im obigen Beispiel wird null zurückgegeben (weil die Funktion ungültig ist), was wir testen, um die Schleife in do_stuff() zu stoppen. Wenn die Coroutine-Funktion einen Wert zurückgibt [zB. Stellen Sie sich return false am Ende von xrange()] vor, dann würde dieser Test fehlschlagen.

Ich denke, ich werde mir den Code mal anschauen.
IMO, Ertrag (Wert) wäre, ähm, wertvoll.

BEARBEITEN: Beim Betrachten des Codes gibt es Komplikationen mit der Signalversion von yield, daher wird der Abschnitt, den ich unten darüber geschrieben habe, vorerst entfernt. Kann später näher ausgeführt werden.

Es gibt einige Probleme mit der Funktionsweise yield , daher wird es durch await ersetzt, was einfacher ist. Ich bin mir noch nicht sicher, ob wir wirkliche Generatoren machen werden.

Wenn Sie immer noch an der Idee interessiert sind, Generatoren hinzuzufügen, öffnen Sie bitte ein neues Angebot im GIP-Tracker , indem Sie der angegebenen Problemvorlage folgen (nachdem Sie überprüft haben, dass es noch nicht existiert). Sie können auf dieses Problem verweisen und die Ideen im Vorschlag zusammenfassen. Vielen Dank im Voraus!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen