JavaScriptにおけるイテレータの単一使用性

各イテレータは、ループに一度しか参加できません。 これは少し意外ですが、理にかなっています。 なぜなら、イテレータが一度処理されると、 その done プロパティが false に設定され、 それ以上反復処理ができなくなるからです。

これを確認してみましょう。 次のようなジェネレータがあるとします:

javascriptfunction *func() {
  yield 1;
  yield 2;
  yield 3;
}

イテレータを作成します:

javascriptlet iter = func();

このイテレータを1つのループで反復処理します:

javascriptfor (let elem of iter) {
  console.log(elem); // 1, 2, 3
}

次に、同じイテレータを2つのループで 反復処理しようとします:

javascriptfor (let elem of iter) {
  console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
  console.log(elem); // 動作しない
}

この問題を解決するには、 新しいループごとに新しいイテレータを 作成する必要があります:

javascriptlet 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
}

次のように簡略化できます:

javascriptfor (let elem of func()) {
  console.log(elem); // 1, 2, 3
}

for (let elem of func()) {
  console.log(elem); // 1, 2, 3
}
Задание 1

次のコードに含まれる誤りを修正してください:

javascriptfunction *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);
}