JavaScriptのyieldとgenerator

yieldとgeneratorについての記事を今までいろいろと読んできたけど、自分自身は全然書いていなかったし理解もかなり怪しかったので少し調べて試してみた。

とりあえずyieldについて調べる。MDNのfunction*というページが見つかったので、サンプルコードを読みつつ試してみた。node.jsで実行する際にはver.0.11系で--harmony--harmony-generatorをオプションに指定して実行する必要がある。

function* iterator() {
  yield 1;
  yield 2;
  yield 3;
}

var ite = iterator();

console.log(ite.next());  // { value: 1, done: false }
console.log(ite.next());  // { value: 2, done: false }
console.log(ite.next());  // { value: 3, done: false }
console.log(ite.next());  // { value: undefined, done: true }

function*でgeneratorを宣言して、内部でyieldで関数の実行を止めて値を返す、と。表現が合ってるのかわからないけど。使う方は関数を実行する形でiteratorを受け取ってnext()で進めつつ値を受け取る、と。

無限ループの中でyieldを書いてあげれば、永遠に値を返し続けると。

function* iterator() {
  var index = 0;
  while (true) yield index++;
}

var ite = iterator();

console.log(ite.next());  // { value: 0, done: false }
console.log(ite.next());  // { value: 1, done: false }
console.log(ite.next());  // { value: 2, done: false }

yield*を使うとgenerator内で他のgeneratorの結果を返す事もできるらしい。

function* sub() {
  yield 2;
  yield 3;
}

function* iterator() {
  yield 1;
  yield* sub();
  yield 4;
}

var ite = iterator();

console.log(ite.next());  // { value: 1, done: false }
console.log(ite.next());  // { value: 2, done: false }
console.log(ite.next());  // { value: 3, done: false }
console.log(ite.next());  // { value: 4, done: false }

yieldとgeneratorについて簡単には理解できたと思う。

この辺を調べると一緒にでてくるcoも少し試してみたのだけど、また別の記事で。