ジェネレーター関数が割り当てられるとどうなりますか? [閉まっている]
質問
ファーストクラスの機能を備えたプログラミング言語がある場合。ジェネレーター関数を共有する場合、セマンティクスはどうあるべきですか?
例:
var f = function() {
foreach (i in 0..42)
yield i;
}
int a = f(); // 0
int b = f(); // 1
// Assigning the generator function
var g = f;
int c = g(); // ??
int d = f(); // ??
3つのことを想像できます:
- c == 2、d == 3は、ジェネレーター関数が共有されることを意味します
- c == 0、d == 2は、初期化された値で新しいジェネレーター関数が作成されることを意味します
- c == 2、d == 2は、ジェネレーターの現在の状態をコピーすることで新しいジェネレーター関数が作成されることを意味します
私の意見では、最良の答えは、何らかのメカニズムを実行する最も説得力のある議論を提供するでしょう。多くの場合、先行技術が最も説得力のある議論であることがわかります。
解決
言語に参照セマンティクスがあり、割り当てが通常参照割り当てである場合、オプション1が必要です。
これはPythonで行われ、 are オブジェクトを生成し、割り当ては参照割り当てです(.next()を呼び出して次の値を取得する場合でも)ジェネレーターを「呼び出す」より)。
これがPythonでどのように動作するかを簡単に示します:
>>> def gen():
... for i in range(42):
... yield i
...
>>> f = gen().next
>>> a = f()
>>> b = f()
>>> g = f
>>> c = g()
>>> d = f()
>>> a, b, c, d
(0, 1, 2, 3)
所属していません StackOverflow