Özel iterator oluşturma
Bir nesneye Symbol.iterator ekleyerek özel iterator oluşturmayı öğrenirsin.
Özel iterator oluşturma
Kendi iterator'ünü yazmak için bir nesneye [Symbol.iterator] eklersin. Metodun içinde let ile bir durum değişkeni tanımlarsın; bu değişken döngü boyunca nerede olduğunu hatırlar. Döndürdüğün iç nesnenin next() metodu bu değişkeni okur ve bir adım ilerletir.
Bu desene stateful iterator denir. Durum değişkeni [Symbol.iterator] çağrıldığında yaratılır; her döngü kendi durumuna sahip olur. Bu sayede aynı iterable'ı bağımsız biçimde birden fazla kez gezebilirsin.
Closure ile durum
[Symbol.iterator] içinde let ile tanımladığın değişken, döndürülen iterator nesnesinin next() metodu tarafından closure ile yakalanır. Her next() çağrısı aynı değişkene erişir ve değerini günceller; böylece durum adım adım ilerler.
Her [Symbol.iterator] çağrısı yeni bir let yaratır. Yani aynı iterable'dan alınan iki iterator birbirini etkilemez. Bu, bağımsız döngüler için kritik bir ayrımdır.
Uygulama Sayı aralığı iterable'ı
range adında bir nesne oluştur; from ve to özellikleri olsun (örn. 1 ve 5). Nesneye [Symbol.iterator] ekle. Metodun içinde let current = this.from; ile durumu başlat. Döndürülen iterator'ün next() metodu current <= this.to iken { value: current++, done: false }, aksi halde { value: undefined, done: true } dönsün. Sonra for...of ile sayıları console.log ile yazdır.
Örnek çözümü göster
const range = {
from: 1,
to: 5,
[Symbol.iterator]() {
let current = this.from;
const to = this.to;
return {
next() {
if (current <= to) {
return { value: current++, done: false };
}
return { value: undefined, done: true };
}
};
}
};
for (const num of range) {
console.log(num);
}
Kendini test et
-
Özel bir iterator'da [Symbol.iterator] ne döndürmeli?
- Bir iterator nesnesi (next metodu olan)
- Bir sayı
- Bir dizi
- Bir dize
Cevabı göster
Bir iterator nesnesi (next metodu olan) — Doğru. [Symbol.iterator] next() metodu olan bir iterator döndürür.
-
Durum değişkenini tanımla
const range = { from: 1, to: 5, [Symbol.iterator]() { ____ return { next() { if (this.to >= current) { return { value: current++, done: false }; } return { done: true }; } }; } };Cevabı göster
const range = { from: 1, to: 5, [Symbol.iterator]() { let current = this.from; return { next() { if (this.to >= current) { return { value: current++, done: false }; } return { done: true }; } }; } }; -
Özel iterator kavramları
- [Symbol.iterator]
- Iterator üreten metod
- let current
- Closure'da tutulan durum
- next()
- Bir adım ilerletir
- done: true
- Tükenme bilgisi