概要
前回に投稿したジェネレータについて、実際にコードを書いて試してみます。
非常に簡単な例を書いてみます。
function* g_test(s) { console.log(s); yield; console.log(s+1); yield; console.log(s+2); } //ジェネレータ関数に引数を渡して呼び出す let gene = g_test(100); //1回目の実行 gene.next(); //2回目の実行 gene.next(); //3回目の実行 gene.next();
上記を実行すると、次のようになります。
100 101 102
geneを生成した後、gene.next();とすることで、g_test関数を実行しています。
ここで、注意が必要な点は、functionの後に「*」をつけていることです。
function* g_test(s)
と記述することで、g_test()はジェネレータとしての振る舞いをする関数として定義されています。
また、ジェネレータから値を取り出す際には、関数内部で値を返すように書く方法があります。
次のようなサンプルを書いて、試してみます。
function* g_test(s) { yield s; yield s+10; yield s+20; } //ジェネレータ関数に引数を渡して呼び出す let gene = g_test(100); //1回目の実行 console.log(gene.next()); //2回目の実行 console.log(gene.next()); //3回目の実行 console.log(gene.next());
上記の場合は、firefoxの開発ツールで確認したところ、下記のような出力がされます。
Object { value: 100, done: false } Object { value: 110, done: false } Object { value: 120, done: false }
注意する点は、ジェネレータの2回目の呼び出しと、3回目の呼び出し時に、
関数内で「yield 」の値を返しているという点です。
関数内でyieldを返すことにより、呼び出し元でObjectとして処理結果を受け取り、その内容を使用することが可能になります。
また、ジェネレータに対して、値を渡すことも可能なので、それはまた改めて試して投稿する予定です。