CodeBlanks Logo Icon CodeBlanks

Meydan okuma - Custom iterable

JavaScript kursu · İleri seviye · Ders 98/100

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

  1. 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.

  2. 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;
      }
    }
  3. Iterable kavramlarını eşleştir

    Symbol.iterator
    Iterable protokolü
    function*
    Generator fonksiyon
    yield
    Değer üretir
    .next()
    Bir sonraki değer

İleri seviye bölümündeki tüm dersler