JavaScriptにおけるイテレータの単一使用性
各イテレータは、ループに一度しか参加できません。
これは少し意外ですが、理にかなっています。
なぜなら、イテレータが一度処理されると、
その done プロパティが false に設定され、
それ以上反復処理ができなくなるからです。
これを確認してみましょう。 次のようなジェネレータがあるとします:
function *func() {
yield 1;
yield 2;
yield 3;
}
イテレータを作成します:
let iter = func();
このイテレータを1つのループで反復処理します:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
次に、同じイテレータを2つのループで 反復処理しようとします:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // 動作しない
}
この問題を解決するには、 新しいループごとに新しいイテレータを 作成する必要があります:
let iter1 = func();
for (let elem of iter1) {
console.log(elem); // 1, 2, 3
}
let iter2 = func();
for (let elem of iter2) {
console.log(elem); // 1, 2, 3
}
次のように簡略化できます:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
次のコードに含まれる誤りを修正してください:
function *func() {
for (let i = 1; i <= 3; i++) {
yield i;
}
}
let elems = func();
for (let elem of elems) {
console.log(elem);
}
for (let elem of elems) {
console.log(elem);
}