0Pricing
Ruby Academy · Lekcja

Obiekty Enumerator

Iteracja zewnętrzna

Obiekty Enumerator to bezpłatna lekcja Ruby Academy na CoddyKit. To lekcja 4 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.

Iteracja zewnętrzna

Enumerator to obiekt reprezentujący iterację. Obsługuje iterację zewnętrzną: wartości są pobierane pojedynczo za pomocą next, zamiast przekazywania bloku do each.

enum = [10, 20, 30].each
puts enum.next
puts enum.next

Uzyskiwanie enumeratora

Wywołaj metodę iterującą, taką jak each, bez bloku, aby otrzymać Enumerator zamiast uruchamiać iterację.

enum = [1, 2, 3].each
puts enum.class

Pobieranie za pomocą next

next zwraca kolejny element przy każdym wywołaniu. Enumerator pamięta swoją pozycję.

letters = ["a", "b", "c"].each
puts letters.next
puts letters.next
puts letters.next

StopIteration na końcu

Gdy zabraknie wartości, next zgłasza wyjątek StopIteration. Można go przechwycić, aby poprawnie zakończyć iterację.

enum = [1, 2].each
begin
  loop { puts enum.next }
rescue StopIteration
  puts "done"
end

peek i rewind

peek sprawdza następną wartość bez przesuwania pozycji, a rewind resetuje ją do początku.

enum = [5, 6, 7].each
puts enum.peek
puts enum.next
enum.rewind
puts enum.next

Budowanie własnych enumeratorów

Utwórz własny enumerator za pomocą Enumerator.new. Blok otrzymuje obiekt yielder y; wartości należy przekazywać za pomocą y << lub y.yield.

evens = Enumerator.new do |y|
  n = 0
  loop do
    y << n
    n += 2
  end
end
puts evens.next
puts evens.next
puts evens.next

Nieskończone enumeratory

Ponieważ działają na zasadzie pobierania, własne enumeratory mogą być nieskończone. Pobiera się z nich tylko tyle wartości, ile potrzeba.

counter = Enumerator.new do |y|
  i = 1
  loop { y << i; i += 1 }
end
p counter.first(5)

Enumeratory są Enumerable

Enumerator dołącza Enumerable, więc działają na nim wszystkie typowe metody (map, select, take), łącząc iterację wewnętrzną i zewnętrzną.

fib = Enumerator.new do |y|
  a, b = 0, 1
  loop do
    y << a
    a, b = b, a + b
  end
end
p fib.take(8)

with_index

with_index dołącza indeks do dowolnego enumeratora, opcjonalnie rozpoczynając od wybranej liczby.

["x", "y", "z"].each.with_index(1) do |item, i|
  puts "#{i}: #{item}"
end

Zwracanie enumeratora z each

We własnych klasach, gdy nie podano bloku, należy zwracać to_enum(:each) (lub enum_for), aby wywołujący mogli iterować zewnętrznie.

class Trio
  def each
    return to_enum(:each) unless block_given?
    yield 1; yield 2; yield 3
  end
end
e = Trio.new.each
puts e.next
puts e.next

Łączenie elementów

Enumeratory zapewniają szczegółową kontrolę:

  • Pobieranie wartości za pomocą next, podgląd wartości lub przewijanie wstecz.
  • Tworzenie własnych za pomocą Enumerator.new i obiektu yielder.
  • Są obiektami Enumerable, więc działają z nimi metody map/select/take.
odds = Enumerator.new do |y|
  n = 1
  loop { y << n; n += 2 }
end
p odds.first(4)

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat obiektów Enumerator.

Podsumowanie

Poznałeś obiekty Enumerator:

  • Iteracja zewnętrzna za pomocą next, peek i rewind.
  • StopIteration sygnalizuje koniec iteracji.
  • Tworzenie własnych za pomocą Enumerator.new { |y| ... }.
  • Są obiektami Enumerable i mogą być nieskończone.
nums = Enumerator.new { |y| 1.upto(3) { |n| y << n } }
puts nums.next
puts nums.next

Często zadawane pytania

Czy lekcja „Obiekty Enumerator” jest bezpłatna?

Tak — pełny tekst „Obiekty Enumerator” 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 „Obiekty Enumerator”?

Iteracja zewnętrzna Ć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 4 z 4.

Ile czasu zajmuje lekcja „Obiekty Enumerator”?

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