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 runsZalety 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
- Funkcje wyższego rzędu i curryfikacja
- fold, reduce i expand
- Leniwe obiekty iterowalne i generatory z sync*
- Tworzenie potoków funkcji czystych