Sobes.tech
Middle

Dart dilində generatorlar (sync* və async*) nədir və necə işləyirlər?

sobes.tech Süni İntellekt

AI-dan cavab

Dart-də generatorlar, bütün nəticəni dərhal deyil, yaradılarkən ardıcıl dəyərlər seriyasını qaytaran funksiyalardır. Onlar üçün sync* (sinxron) və async* (asinxron) açar sözlər istifadə olunur.

Sinxron generatorlar (sync*)

Iterable tipində obyekt qaytarır. Növbəti dəyəri çıxarmaq üçün yield açar sözündən istifadə edir. İcra axını növbəti dəyər tələb olunana qədər dayandırılır (məsələn, for-in döngüsündə).

Iterable<int> countUpTo(int max) sync* {
  for (int i = 1; i <= max; i++) {
    yield i; // Dəyəri çıxarır
  }
}

Asinxron generatorlar (async*)

Stream tipində obyekt qaytarır. Növbəti dəyəri çıxarmaq üçün yield açar sözündən istifadə edir. Həmçinin, başqa bir Stream-in bütün dəyərlərini çıxarmaq üçün yield* istifadə olunur. İcra axını dayandırılır və yeni asinxron hadisə baş verəndə davam etdirilir.

Stream<int> countUpToAsync(int max) async* {
  for (int i = 1; i <= max; i++) {
    await Future.delayed(Duration(milliseconds: 100)); // Asinxron işi təqlid edir
    yield i; // Dəyəri çıxarır
  }
}

İş prinsipi:

Generator funksiyasını çağıranda, funksiyanın bədəni dərhal icra edilmir. Ob'ekt (hər iki halda Iterable və ya Stream) qaytarılır. Funksiyanın faktiki icrası, ilk dəfə dəyər almağa çalışdığınız zaman başlayır. yield açar sözünə çatanda, dəyər "xaricə" ötürülür və funksiyanın vəziyyəti yadda saxlanılır. Bədən icrası dayandırılır. Növbəti dəyər almağa çalışdığınız zaman, icra dayandığı yerdən davam edir, növbəti yield-ə və ya funksiyanın sonuna qədər.

Fərqlər:

Xüsusiyyət sync* (Sinxron) async* (Asinxron)
Qaytaran tip Iterable Stream
Açar sözlər sync*, yield async*, yield, yield*
await istifadə İcazə verilmir İcazə verilir
Dayanma Növbəti dəyər tələb edilənə qədər Növbəti asinxron hadisə baş verənə qədər