Godot: yield()からの戻り値を実装する

作成日 2015年02月19日  ·  3コメント  ·  ソース: godotengine/godot

ジェネレーター関数を作成するには、yield(value)を実装する必要があります。 これはyield()のように機能しますが、 'value'が返され、resume()呼び出しから返されます。

これにより、潜在的に巨大な配列を作成するのではなく、range()をイテレータにすることができます。

これは、リスト/辞書の理解などの優れた機能への一歩でもあります。

archived feature proposal gdscript

最も参考になるコメント

私はGodotを使い始めたばかりですが(これまでのところ気に入っています)、yield()は関数の状態よりも多くを返すことができるはずだと感じていることに同意します。 Yieldは、resume()を使用して戻る機能に似ているため、関数はyieldによって値を「返す」ことができるはずです。

私が考えていた1つの可能なアプローチは、[GDScript] FunctionStateを拡張することです。
(https://docs.godotengine.org/en/3.1/classes/class_gdscriptfunctionstate.html)
引数をyield()に返すメソッドvalue()が必要です。

func co1():
     yield(5)

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

GDscriptには、すでに2つの値を取り、シグナルを待機するyieldがあります。 ただし、この1つの引数バージョンは、FunctionStateでその引数を返すだけです。 その変更だけで、ジェネレータは次のように書くことができます。

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()

これは非常にうまく機能しますが、検討する価値のある微妙な点があります。 コルーチン関数が(yieldではなく)戻ると、FunctionStateではなく値が返されます。 上記の例では、nullが返され(関数がvoidであるため)、do_stuff()でループを停止するためにテストします。 コルーチン関数が値を返す場合[例: xrange()]の最後にreturn falseがあると想像してください。そうすると、そのテストは失敗します。

コードを見てみようと思います。
IMO、yield(value)は、えーと、価値があります。

編集:コードを見ると、yieldのシグナルバージョンに問題があるため、以下に記述したセクションは今のところ削除されています。 後で詳しく説明する場合があります。

全てのコメント3件

不快な回避策:

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()

私はGodotを使い始めたばかりですが(これまでのところ気に入っています)、yield()は関数の状態よりも多くを返すことができるはずだと感じていることに同意します。 Yieldは、resume()を使用して戻る機能に似ているため、関数はyieldによって値を「返す」ことができるはずです。

私が考えていた1つの可能なアプローチは、[GDScript] FunctionStateを拡張することです。
(https://docs.godotengine.org/en/3.1/classes/class_gdscriptfunctionstate.html)
引数をyield()に返すメソッドvalue()が必要です。

func co1():
     yield(5)

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

GDscriptには、すでに2つの値を取り、シグナルを待機するyieldがあります。 ただし、この1つの引数バージョンは、FunctionStateでその引数を返すだけです。 その変更だけで、ジェネレータは次のように書くことができます。

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()

これは非常にうまく機能しますが、検討する価値のある微妙な点があります。 コルーチン関数が(yieldではなく)戻ると、FunctionStateではなく値が返されます。 上記の例では、nullが返され(関数がvoidであるため)、do_stuff()でループを停止するためにテストします。 コルーチン関数が値を返す場合[例: xrange()]の最後にreturn falseがあると想像してください。そうすると、そのテストは失敗します。

コードを見てみようと思います。
IMO、yield(value)は、えーと、価値があります。

編集:コードを見ると、yieldのシグナルバージョンに問題があるため、以下に記述したセクションは今のところ削除されています。 後で詳しく説明する場合があります。

yieldの動作にはいくつかの問題があるため、より簡単なawaitに置き換えられます。 実際の発電機を使うかどうかはまだわかりません。

ジェネレーターを追加するアイデアにまだ興味がある場合は、指定された問題テンプレートに従ってGIPトラッカーで新しい提案を開いてください(まだ存在しないことを確認した後)。 この問題を参照して、提案のアイデアを要約することができます。 前もって感謝します!

このページは役に立ちましたか?
0 / 5 - 0 評価