0Pricing
Ruby Academy · Lekcja

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 result

Problem 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_three

Tworzenie 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.class

Nic 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 all

Leniwe łą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 result

take 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 result

Nieskoń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_match

Kiedy 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 fizz

Połączenie wszystkiego

Leniwe enumeratory odraczają wykonanie operacji:

  • .lazy sprawia, ż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:

  • .lazy odracza 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

  1. Pisanie własnego each
  2. Dołączanie Enumerable
  3. Leniwe enumeratory
  4. Obiekty Enumerator
← Powrót do Ruby Academy