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.nextUzyskiwanie enumeratora
Wywołaj metodę iterującą, taką jak each, bez bloku, aby otrzymać Enumerator zamiast uruchamiać iterację.
enum = [1, 2, 3].each
puts enum.classPobieranie 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.nextStopIteration 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"
endpeek 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.nextBudowanie 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.nextNieskoń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}"
endZwracanie 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.newi 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,peekirewind. StopIterationsygnalizuje 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.nextCzę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
- Pisanie własnego each
- Dołączanie Enumerable
- Leniwe enumeratory
- Obiekty Enumerator