Leniwe enumeratory
Ewaluacja leniwa
Leniwe enumeratory to bezpłatna lekcja Ruby 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 Ruby Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Leniwa ewaluacja
Zwykle metody Enumerable przetwarzają całą kolekcję naraz. Leniwy enumerator przetwarza elementy pojedynczo, tylko w razie potrzeby. Dzięki temu można pracować z ogromnymi, a nawet nieskończonymi sekwencjami.
result = (1..Float::INFINITY).lazy.map { |n| n * 2 }.first(5)
p resultProblem z metodami zachłannymi
Wywołanie map dla nieskończonego zakresu bez użycia lazy nigdy by się nie zakończyło, ponieważ najpierw próbuje utworzyć kompletną tablicę wyników.
# Eager version would hang. Lazy completes instantly:
first_three = (1..Float::INFINITY).lazy.select(&:even?).first(3)
p first_threeTworzenie leniwego enumeratora
Wywołaj .lazy dla dowolnego obiektu Enumerable, aby uzyskać jego leniwą wersję. Połączone metody również stają się leniwe.
lazy = (1..10).lazy
puts lazy.classNic nie wykonuje się bez wymuszenia
Leniwe łańcuchy tworzą receptę, ale nie wykonują operacji. Metoda końcowa, taka jak first, to_a lub force, uruchamia przetwarzanie.
chain = (1..Float::INFINITY).lazy.map { |n| n * n }
puts "Nothing computed yet"
p chain.first(4)Wymuszanie wyników
force (alias to_a) materializuje ograniczony leniwy łańcuch w postaci tablicy.
result = (1..20).lazy.select(&:odd?).first(5)
p result
all = (1..6).lazy.map { |n| n * 10 }.force
p allLeniwe łączenie metod
Wiele leniwych operacji jest przeplatanych dla każdego elementu, zamiast być wykonywanych jako osobne pełne przebiegi. Każda wartość przechodzi przez cały łańcuch, zanim rozpocznie się przetwarzanie następnej.
result = (1..Float::INFINITY)
.lazy
.map { |n| n * n }
.select { |n| n.even? }
.first(4)
p resulttake i take_while
Leniwe take i take_while przestają pobierać wartości po spełnieniu odpowiedniego warunku.
result = (1..Float::INFINITY).lazy.take_while { |n| n < 6 }.to_a
p resultNieskończone sekwencje
Leniwe enumeratory doskonale sprawdzają się w przypadku generatorów. W połączeniu z Enumerator pozwalają modelować nieskończone strumienie.
naturals = Enumerator.new do |y|
n = 1
loop { y << n; n += 1 }
end
p naturals.lazy.map { |x| x * 3 }.first(5)Efektywne wykorzystanie pamięci
Ponieważ leniwe łańcuchy nigdy nie materializują całej kolekcji pośredniej, oszczędzają pamięć podczas filtrowania dużych zbiorów danych do kilku wyników.
big = (1..1_000_000).lazy
first_match = big.select { |n| n % 7 == 0 && n % 11 == 0 }.first
puts first_matchKiedy używać lazy
Używaj lazy, gdy:
- źródło jest nieskończone lub bardzo duże;
- potrzebujesz tylko kilku wyników;
- chcesz uniknąć dużych tablic pośrednich.
W przypadku małych kolekcji metody zachłanne są prostsze i wystarczająco szybkie.
fizz = (1..Float::INFINITY).lazy.select { |n| n % 3 == 0 }.first(5)
p fizzPołączenie wszystkiego
Leniwe enumeratory odraczają wykonanie operacji:
.lazysprawia, że łańcuch staje się leniwy.- Operacje są wykonywane dopiero wtedy, gdy metoda końcowa pobierze wartości.
- To idealne rozwiązanie dla nieskończonych lub ogromnych sekwencji.
squares = (1..Float::INFINITY).lazy.map { |n| n * n }
p squares.select(&:odd?).first(4)Szybkie sprawdzenie
Sprawdź swoją znajomość leniwych enumeratorów.
Podsumowanie
Omówiono leniwe enumeratory:
.lazyodracza obliczenia.- Metody końcowe (
first,to_a,force) uruchamiają przetwarzanie. - Każda wartość na żądanie przechodzi przez cały łańcuch.
- To idealne rozwiązanie dla nieskończonych lub dużych sekwencji.
p (1..Float::INFINITY).lazy.select(&:even?).map { |n| n + 1 }.first(3)Często zadawane pytania
Czy lekcja „Leniwe enumeratory” jest bezpłatna?
Tak — pełny tekst „Leniwe enumeratory” 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 Ruby Academy, przejdź na CoddyKit PRO. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Leniwe enumeratory”?
Ewaluacja leniwa Ćwiczysz Ruby 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ąć Ruby Academy?
Nie wymagamy żadnego doświadczenia. Ruby 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 enumeratory”?
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 Ruby Academy?
Tak. Każda lekcja Ruby 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
- Pisanie własnego each
- Dołączanie Enumerable
- Leniwe enumeratory
- Obiekty Enumerator