Meydan okuma - Custom iterable
Symbol.iterator ve generator ile özel bir iterable koleksiyon yazarsın.
Özel iterable
Bu meydan okumada bir Range sınıfı yazacaksın; start'tan end'e kadar sayıları dolaşan özel bir iterable olur. Bir nesneyi iterable yapmak için [Symbol.iterator] yöntemini tanımlarsın.
Bu yöntem bir iterator döndürür — yani next() yöntemi olan ve her çağrıda bir sonraki değeri veren bir nesne. Iterator protokolü { value, done } şeklinde sonuç döndürür.
En kolay yol, bu yöntemi bir generator olarak yazmaktır: function* ile başlar ve yield ile değer üretir.
Generator ve yield
Bir generator fonksiyon function* ile bildirilir. İçinde yield anahtar kelimesi bir değer üretir ve duraklar; bir sonraki next() çağrısında kaldığı yerden devam eder.
function* count() {
yield 1;
yield 2;
}Bir sınıf yönteminde generator kullanmak için yöntem adından önce * koyarsın: *[Symbol.iterator]() { ... yield ... }. Bu, elle next() yazmaktan çok daha kısadır.
Uygulama Range sınıfını iterable yap
Bir Range sınıfı yaz: yapıcısı start ve end alır ve this.start, this.end'e atar. Sınıfa *[Symbol.iterator]() generator yöntemi ekle; for döngüsüyle this.start'tan this.end'e kadar yield ile her sayıyı üret.
Örnek çözümü göster
class Range { constructor(start, end) { this.start = start; this.end = end; } *[Symbol.iterator]() { for (let n = this.start; n <= this.end; n++) { yield n; } } } yaz.
Örnek çözüm:
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
*[Symbol.iterator]() {
for (let n = this.start; n <= this.end; n++) {
yield n;
}
}
}
Kendini test et
-
Bir nesneyi iterable yapan yöntem hangisidir?
class Range { *[Symbol.iterator]() { yield 1; } }- Symbol.iterator
- Symbol.generator
- Symbol.iterable
- Symbol.next
Cevabı göster
Symbol.iterator — Doğru! [Symbol.iterator] yöntemi iterable protokolünü sağlar.
-
Generator iterator yöntemini ekle
class Range { constructor(start, end) { this.start = start; this.end = end; } ____ yield this.start; yield this.end; } }Cevabı göster
class Range { constructor(start, end) { this.start = start; this.end = end; } *[Symbol.iterator]() { yield this.start; yield this.end; } } -
Iterable kavramlarını eşleştir
- Symbol.iterator
- Iterable protokolü
- function*
- Generator fonksiyon
- yield
- Değer üretir
- .next()
- Bir sonraki değer