ジェネレーター関数を作成するには、yield(value)を実装する必要があります。 これはyield()のように機能しますが、 'value'が返され、resume()呼び出しから返されます。
これにより、潜在的に巨大な配列を作成するのではなく、range()をイテレータにすることができます。
これは、リスト/辞書の理解などの優れた機能への一歩でもあります。
不快な回避策:
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トラッカーで新しい提案を開いてください(まだ存在しないことを確認した後)。 この問題を参照して、提案のアイデアを要約することができます。 前もって感謝します!
最も参考になるコメント
私はGodotを使い始めたばかりですが(これまでのところ気に入っています)、yield()は関数の状態よりも多くを返すことができるはずだと感じていることに同意します。 Yieldは、resume()を使用して戻る機能に似ているため、関数はyieldによって値を「返す」ことができるはずです。
私が考えていた1つの可能なアプローチは、[GDScript] FunctionStateを拡張することです。
(https://docs.godotengine.org/en/3.1/classes/class_gdscriptfunctionstate.html)
引数をyield()に返すメソッドvalue()が必要です。
GDscriptには、すでに2つの値を取り、シグナルを待機するyieldがあります。 ただし、この1つの引数バージョンは、FunctionStateでその引数を返すだけです。 その変更だけで、ジェネレータは次のように書くことができます。
これは非常にうまく機能しますが、検討する価値のある微妙な点があります。 コルーチン関数が(yieldではなく)戻ると、FunctionStateではなく値が返されます。 上記の例では、nullが返され(関数がvoidであるため)、do_stuff()でループを停止するためにテストします。 コルーチン関数が値を返す場合[例: xrange()]の最後に
return false
があると想像してください。そうすると、そのテストは失敗します。コードを見てみようと思います。
IMO、yield(value)は、えーと、価値があります。
編集:コードを見ると、yieldのシグナルバージョンに問題があるため、以下に記述したセクションは今のところ削除されています。 後で詳しく説明する場合があります。