Μονομερής λειτουργία των επαναληπτών στην JavaScript
Κάθε επαναλήπτης μπορεί να συμμετέχει σε έναν βρόχο
μόνο μία φορά. Αυτό είναι λίγο απροσδόκητο,
αλλά λογικό - αφού ο επαναλήπτης που έχει διατρέξει
ορίζει το done σε false,
που σημαίνει ότι δεν μπορεί να ξαναδιατρέξει.
Ας το επιβεβαιώσουμε αυτό. Ας υποθέσουμε ότι έχουμε τον ακόλουθο γεννήτορα:
function *func() {
yield 1;
yield 2;
yield 3;
}
Ας δημιουργήσουμε έναν επαναλήπτη:
let iter = func();
Ας διατρέξουμε τον επαναλήπτη με έναν βρόχο:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
Τώρα ας διατρέξουμε τον επαναλήπτη με δύο βρόχους:
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);
}