Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

ジェネレータ関数を使って、オレオレ・イテレータを作る

ジェネレータ関数を作るfunction*()記法を使って、オレオレ・イテレータを作ることが出来ます。

  • 基本的に同じルールで進行するが時偶変なパラメータが発生する
  • 任意のフラグが立った際、強制終了したい

……といった、有りがちなケースで使うと効果的です

実際のところ

イテレータなので、next()を呼び出さない限り次には行きません。
たとえば3までの数値を1毎に返したいだけの場合、以下のようにします。
……まぁ、この程度なら配列で済みますが。

function* idMaker(i){
  while (i < 3)
    yield i++;
}

var gen = idMaker(0);

console.log(gen.next().value);
console.log(gen.next().value);
// 0 
// 1

yieldを使う事で次の値を指定できるわけですが、
ここでyield*を使うと……なんと別のジェネレータ関数に飛ぶ事も可能です。
よくあるfizzbuzzだとこんな感じに実装できます。

var gen = fizzbuzzChecker(1);

for (i = 0; i < 16; i++)
  console.log(gen.next());


function* fizzbuzzChecker(i){
  while(true)
  {
    if ((i % 15) == 0) { yield* fizzbuzz(); i++ }
    if ((i % 3) == 0)  { yield* fizz(); i++}
    if ((i % 5) == 0)  { yield* buzz(); i++}
    yield i++;
  }
}

function* fizzbuzz() { yield 'fizzbuzz'; }
function* fizz()     { yield 'fizz'; }
function* buzz()     { yield 'buzz'; }