~文法メモ~ イテレータとジェネレータジェネレータ各種スクリプト言語で、概ね「yield」というキーワードがあれば、 各種言語で概ね共通したイメージとしては、 という感じです。 yieldの一番簡単な例function* sampleGenerator(i) { yield i + 1; // ここで i+1を返して、関数は(次の呼び出しまで)一端停止 yield i + 2; // ここで i+2を返して、関数は(次の呼び出しまで)一端停止 yield i + 3; // ここで i+2を返して、関数は(次の呼び出しまで)一端停止 } var gen = sampleGenerator(10); hm.debuginfo(gen.next().value); // 10 hm.debuginfo(gen.next().value); // 11 hm.debuginfo(gen.next().value); // 12 yieldの単純な例function* idMaker(){ var index = 0; while(true) { yield index++; } } var gen = idMaker(); hm.debuginfo(gen.next().value); // 0 hm.debuginfo(gen.next().value); // 1 hm.debuginfo(gen.next().value); // 2 yieldの中で別のyieldを使うyieldの中で別のyieldを使用する場合には、 function* anotherGenerator(i) { yield i + 1; yield i + 2; yield i + 3; } function* generator(i){ yield i; yield* anotherGenerator(i); yield i + 10; } var gen = generator(10); hm.debuginfo(gen.next().value); // 10 hm.debuginfo(gen.next().value); // 11 hm.debuginfo(gen.next().value); // 12 hm.debuginfo(gen.next().value); // 13 hm.debuginfo(gen.next().value); // 20 yieldが返しているもの「yield」(より厳密には「yield.next()」)が返しているものは、 function* sampleGenerator() { yield "あ" yield "い" yield "う" } var gen = sampleGenerator(); hm.debuginfo(gen.next()); // {"value":"あ","done":false} hm.debuginfo(gen.next()); // {"value":"い","done":false} hm.debuginfo(gen.next()); // {"value":"う","done":false} hm.debuginfo(gen.next()); // {"done":true} for...ofなどによるジェネレータのループ「for...of」先述した仕組みで「done:true」が出現するまで、 function* sampleGenerator() { yield "あ" yield "い" yield "う" } for (let e of sampleGenerator()) { hm.debuginfo(e); } // "あ" // "い" // "う" for (let e of sampleGenerator()) { hm.debuginfo(e); } // "あ" // "い" // "う" 2つ「for...of」があります。 |