Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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

ジェネレータ関数を作る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'; }