2016-05-15 3 views
3

、私は物事が壊れyield *createFib(b, b + a);ラインの外に*を残す場合はその後、私は最初の20件の結果再帰的なジェネレータ関数の降伏平均後の*(星/アスタリスク)構文は何ですか?

let fibber = createFibonacciIterator(); 
for (let ii = 0; ii < 20; ii++) { 
    console.log(fibber.next()); 
} 

を取得するためにその発電機を使用するのは、私はES6ジェネレータに

function *createFibonacciIterator(a = 0, b = 1) { 
    yield b; 
    yield *createFib(b, b + a); // <== QUESTION IS ABOUT THIS LINE 
} 

を作成したとしましょうどのイテレータを生成するのではなく、実際の値が必要なので、理にかなっています。

発電機の*の技術的な意味は何ですか? *が、これはそれがジェネレータ関数であることを意味function宣言で使用される場合

+3

'yield *'は別のジェネレータに委譲します。 – Pointy

+0

は、値を平坦化し、それらをジェネレータ関数* lazilyに連結することができます。 – YOU

答えて

0
yield *smth; 

for (let x of smth) { 
    yield x; 
} 
+0

これは問題なく簡単ですが、 'yield * generator()'が評価するものには言及していません。これはジェネレータオブジェクトによって 'return'されたend-of-iteration値です。また、ジェネレータのコンシューマがジェネレータなどにスローされたときに何が起こるかを正しく表現していません。 –

+1

@torazaburo、例を表示できますか? – Qwertiy

2

と同じことになります。

しかし、それはyield *myGeneratorFunction()として使用する場合、Ecmascript 262 specification, Section 14.4.14の定義は、エンジンがジェネレータ関数によって返されたイテレータのnext()メソッドを呼び出すジェネレータ関数を解決しようと言っています。

yield*(たとえば、yield createFibonacci())なしで使用した場合、yieldの後に式の値を返します。この例では、createFibonacciの値が返されます。

+0

オンライン仕様:http://www.ecma-international.org/ecma-262/6.0/#sec-14.4.14 – Oriol

+0

はい、これは良いです。ありがとう –

+1

これは少し混乱しています。 *反復子の次の値は関数*の戻り値ですが、 'yield'は関数ではありません。これはキーワードであり、結果として値が得られます。 「エンジンは解決しようとします...」と言っていますが、実際には 'myGeneratorFunction'が期待どおりに呼び出され、iterableを返し、' yield * 'は他のiterable(' [[ 1、2] 'など)。ジェネレータ関数には 'next()'メソッドはありません。 'next()'関数を持つジェネレータ関数によってiterable **が返されます**。 –

関連する問題