Enkratno delovanje iteratorjev v JavaScript
Vsak iterator lahko sodeluje v zanki
le enkrat. To je nekoliko nepričakovano,
vendar logično - saj iterator, ki je bil že uporabljen,
nastavi svoj done na false,
kar pomeni, da ne more biti več uporabljen za ponovno prebiranje.
Preverimo to. Recimo, da imamo naslednji generator:
function *func() {
yield 1;
yield 2;
yield 3;
}
Ustvarimo iterator:
let iter = func();
Ponovimo iterator z eno zanko:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
Zdaj pa poskusimo iterator ponoviti z dvema zankama:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // ne deluje
}
Za rešitev problema je treba za vsako novo zanko ustvariti svoj iterator:
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
}
Lahko poenostavimo:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
Popravite napako, ki je bila storjena v naslednji kodi:
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);
}