0Pricing
Dart Academy · Lekcja

Leniwe obiekty iterowalne i generatory z sync*

Generowanie wartości na żądanie

Leniwe obiekty iterowalne i generatory z sync* to bezpłatna lekcja Dart Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Dart Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Dart Academy zawiera 4 lekcji w sumie.

Znaczenie leniwego działania

Leniwy obiekt iterowalny nie oblicza wartości, dopóki nie zostaną one rzeczywiście zażądane. Praca odbywa się na żądanie, a nie od razu w całości. 🦥

Obiekty iterowalne są leniwe

Metody takie jak map i where zwracają leniwy obiekt typu Iterable. Nic nie jest wykonywane, dopóki obiekt nie zostanie przeiterowany lub nie zostanie wywołane toList.

var it = [1, 2, 3].map((n) {
  print('seen $n');
  return n * 2;
});

Jeszcze nic się nie wykonuje

Dopóki obiekt iterowalny nie zostanie wykorzystany, ciało funkcji map nie jest wykonywane. Leniwe działanie pozwala opisać pracę i odroczyć jej koszt.

for (var x in it) print(x); // now it runs

Zalety leniwego działania

Leniwe działanie oszczędza pracę, gdy potrzebnych jest tylko kilka wyników. W połączeniu z take pozwala wcześnie zakończyć działanie i pominąć resztę.

var first2 = it.take(2).toList();

Poznajmy generatory sync*

Funkcja sync* jest generatorem tworzącym leniwy obiekt Iterable. Wytwarza wartości pojedynczo, w miarę zgłaszania zapotrzebowania.

Iterable<int> count(int n) sync* {
  for (var i = 1; i <= n; i++) yield i;
}

Słowo kluczowe yield

W generatorze yield przekazuje jedną wartość wywołującemu i wstrzymuje działanie do chwili, gdy potrzebna będzie kolejna wartość.

print(count(3).toList()); // [1, 2, 3]

Nieskończone sekwencje

Wartości są obliczane leniwie, więc generator może bezpiecznie opisywać nieskończoną sekwencję, o ile pobierany jest tylko skończony fragment.

Iterable<int> naturals() sync* {
  var i = 0;
  while (true) yield ++i;
}

Pobieranie skończonego fragmentu

Nieskończony generator należy połączyć z take, aby pobrać tylko potrzebne wartości. Pętla zatrzyma się, gdy tylko fragment zostanie wypełniony.

print(naturals().take(5).toList()); // [1, 2, 3, 4, 5]

Delegowanie za pomocą yield*

Za pomocą yield* można wyemitować każdą wartość z innego obiektu iterowalnego lub generatora. Spłaszcza on jedną sekwencję i włącza ją do bieżącej.

Iterable<int> both() sync* {
  yield* count(2);
  yield* count(2);
}

Generatory a tworzenie list

Generator nie wymaga tworzenia pełnej listy w pamięci. Wartości są przesyłane strumieniowo, dzięki czemu duże lub nieskończone sekwencje pozostają oszczędne pamięciowo.

sync* a async*

sync* służy do tworzenia synchronicznych, leniwych obiektów iterowalnych. Jego asynchroniczny odpowiednik, async*, tworzy Stream dla asynchronicznych sekwencji zdarzeń.

Szybkie sprawdzenie

Sprawdźmy zrozumienie generatorów.

Podsumowanie

Obiekty iterowalne są leniwe, a generatory sync* zwracają wartości na żądanie. Dzięki temu nawet nieskończone sekwencje można modelować niewielkim kosztem. 🌟

Często zadawane pytania

Czy lekcja „Leniwe obiekty iterowalne i generatory z sync*” jest bezpłatna?

Tak — pełny tekst „Leniwe obiekty iterowalne i generatory z sync*” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Dart Academy, przejdź na CoddyKit PRO. Kurs Dart Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Leniwe obiekty iterowalne i generatory z sync*”?

Generowanie wartości na żądanie Ćwiczysz Dart Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Dart Academy?

Nie wymagamy żadnego doświadczenia. Dart Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Leniwe obiekty iterowalne i generatory z sync*”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Dart Academy?

Tak. Każda lekcja Dart Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Funkcje wyższego rzędu i curryfikacja
  2. fold, reduce i expand
  3. Leniwe obiekty iterowalne i generatory z sync*
  4. Tworzenie potoków funkcji czystych
← Powrót do Dart Academy