Iterable ve Iterator
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 68 / 110.
Bir Liste, Küme veya başka bir koleksiyon üzerinde her for-in döngüsü kullandığınızda, perde arkasında Iterable ve Iterator ile çalışırsınız. Bu kavramları anlamak, üzerinde döngü kurulabilen kendi sınıflarınızı oluşturmanızı sağlar.
Iterable, bir değerler dizisi üretebilen herhangi bir nesnedir. Bir temel gereksinimi vardır: bir Iterator döndüren iterator alıcısı. Öğeler arasında tek tek gerçekten ilerleyen şey Iterator’dır:
var numbers = [1, 2, 3];
var iterator = numbers.iterator;
while (iterator.moveNext()) {
print(iterator.current); // 1, sonra 2, sonra 3
}moveNext() yöntemi bir sonraki öğeye ilerler ve eğer bir öğe varsa true, bittiğinde ise false değerini döndürür. current özelliği size geçerli öğeyi verir.
Kendi sınıfınızı yinelenebilir hale getirmek için Iterable arayüzünü uygulayın:
class Countdown extends Iterable<int> {
final int start;
Countdown(this.start);
@override
Iterator<int> get iterator => CountdownIterator(start);
}
class CountdownIterator implements Iterator<int> {
int _current;
CountdownIterator(int start) : _current = start + 1;
@override
int get current => _current;
@override
bool moveNext() {
if (_current > 0) {
_current--;
return true;
}
return false;
}
}
void main() {
for (var n in Countdown(3)) {
print(n); // 3, 2, 1, 0
}
}Şimdi Countdown, for-in döngüleri ve map, where ve fold gibi tüm Iterable metotlarıyla çalışır. Bu desen, Dart'ın koleksiyon ekosistemiyle sorunsuz bir şekilde entegre olan özel koleksiyonlar oluştururken temeldir.
Görev
KolayBir for-in döngüsü kullanılarak üzerinde gezinilebilen özel bir aralık (range) oluşturucu inşa edelim! Belirli bir aralıktaki sayı dizisini oluşturmak için kendi Iterable ve Iterator sınıflarınızı oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
range.dart: Bir sayı dizisi üretmek için birlikte çalışan iki sınıf oluşturun:Iterator<int>arayüzünü uygulayan birRangeIteratorsınıfı. Bu sınıf mevcut konumu takip etmeli ve ne zaman duracağını bilmelidir. Yineleyici (iterator) ilk elemandan önce başlar, bu nedenlecurrentdeğerine erişmeden öncemoveNext()çağrılmalıdır.Iterable<int>sınıfını genişleten birRangesınıfı. Yapıcısında (constructor) birstartveenddeğeri alır ve birRangeIteratordöndüren biriteratoralıcısı (getter) sağlar.
starthem deenddeğerlerini dahil etmelidir. Örneğin,Range(1, 5)şunları üretmelidir: 1, 2, 3, 4, 5.main.dart: Range dosyanızı içe aktarın ve özel iterable yapınızı gösterin:- Bir
Range(1, 5)oluşturun ve her sayıyı kendi satırına yazdırmak için birfor-indöngüsü kullanın - Boş bir satır yazdırın (
'') - Bir
Range(10, 13)oluşturun ve her değeri iki katına çıkarmak içinmapmetodunu kullanın, ardından sonuç listesini yazdırın
- Bir
Range sınıfınız Iterable sınıfını genişlettiği için, map, where ve fold gibi tüm güçlü koleksiyon metotlarına otomatik olarak erişim kazanır - Iterable arayüzünü uygulamanın güzelliği de budur!
Beklenen çıktı:
1
2
3
4
5
[20, 22, 24, 26]Kendin dene
import 'range.dart';
void main() {
// TODO: Bir Range(1, 5) oluşturun ve her sayıyı yazdırmak için bir for-in döngüsü kullanın
// TODO: Boş bir satır yazdırın
// TODO: Bir Range(10, 13) oluşturun, her değeri iki katına çıkarmak için map kullanın ve listeyi yazdırın
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi