Dart'ta jeneratörler (sync* ve async*) nedir ve nasıl çalışırlar?
sobes.tech yapay zeka
AI'dan gelen yanıt
Dart'ta jeneratörler, tüm sonucu hemen döndürmek yerine, üretildikçe değer dizisi döndüren fonksiyonlardır. sync* anahtar kelimesi senkron jeneratörler için, async* ise asenkron jeneratörler içindir.
Senkron jeneratörler (sync*)
Iterable türünde bir nesne dönerler. Bir sonraki değeri vermek için yield anahtar kelimesini kullanırlar. Çalışma akışı, bir sonraki değer talep edilene kadar duraklatılır (örneğin, for-in döngüsünde).
Iterable<int> countUpTo(int max) sync* {
for (int i = 1; i <= max; i++) {
yield i; // Değeri ver
}
}
Asenkron jeneratörler (async*)
Stream türünde bir nesne dönerler. Bir sonraki değeri vermek için yield anahtar kelimesini kullanırlar. Ayrıca, başka bir Stream'in tüm değerlerini vermek için yield* kullanılır. Çalışma akışı, yeni bir asenkron olay oluşana kadar duraklatılır ve devam ettirilir.
Stream<int> countUpToAsync(int max) async* {
for (int i = 1; i <= max; i++) {
await Future.delayed(Duration(milliseconds: 100)); // Asenkron işi taklit et
yield i; // Değeri ver
}
}
Nasıl çalışırlar:
Generator fonksiyon çağrıldığında, fonksiyon gövdesi hemen çalıştırılmaz. Bir nesne (ya Iterable ya da Stream) döndürülür. Gerçek fonksiyon gövdesinin yürütülmesi, ilk kez değeri almaya çalıştığınızda başlar. yield anahtarına ulaşıldığında, değer "dışarı" aktarılır ve fonksiyonun durumu kaydedilir. Gövde yürütmesi duraklatılır. Bir sonraki değeri almaya çalıştığınızda, yürütme durduğu yerden devam eder, bir sonraki yield veya fonksiyonun sonuna kadar.
Farklar:
| Özellik | sync* (Senkron) | async* (Asenkron) |
|---|---|---|
| Dönen tip | Iterable |
Stream |
| Anahtar kelimeler | sync*, yield |
async*, yield, yield* |
await kullanımı |
Kullanılamaz | Kullanılabilir |
| Duraklatma | Sonraki değeri talep edene kadar | Bir sonraki asenkron olay gerçekleşene kadar |