Enumerator-objekt
Extern iteration.
Enumerator-objekt är en gratis lektion i Ruby Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Ruby Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Ruby Academy innehåller totalt 4 lektioner.
Extern iteration
En Enumerator är ett objekt som representerar en iteration. Den stöder extern iteration: ni hämtar värden ett i taget med next i stället för att skicka ett block till each.
enum = [10, 20, 30].each
puts enum.next
puts enum.nextHämta en Enumerator
Anropa en iteratormetod som each utan block för att få en Enumerator i stället för att köra metoden.
enum = [1, 2, 3].each
puts enum.classHämta med next
next returnerar nästa element varje gång det anropas. Enumerator-objektet kommer ihåg sin position.
letters = ["a", "b", "c"].each
puts letters.next
puts letters.next
puts letters.nextStopIteration vid slutet
När värdena tar slut kastar next StopIteration. Det går att fånga undantaget med rescue för att avsluta på ett kontrollerat sätt.
enum = [1, 2].each
begin
loop { puts enum.next }
rescue StopIteration
puts "done"
endpeek och rewind
peek visar nästa värde utan att gå vidare, medan rewind återställer positionen till början.
enum = [5, 6, 7].each
puts enum.peek
puts enum.next
enum.rewind
puts enum.nextSkapa anpassade Enumeratorer
Skapa en egen med Enumerator.new. Blocket tar emot en yielder y; skicka värden med y << eller 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.nextOändliga Enumeratorer
Eftersom anpassade Enumeratorer bygger på hämtning kan de vara oändliga. Hämta bara så många värden som behövs.
counter = Enumerator.new do |y|
i = 1
loop { y << i; i += 1 }
end
p counter.first(5)Enumeratorer är Enumerable
En Enumerator inkluderar Enumerable, så alla vanliga metoder (map, select, take) fungerar också. På så sätt kan intern och extern iteration kombineras.
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 lägger till ett index i valfri Enumerator, med möjlighet att börja från ett anpassat nummer.
["x", "y", "z"].each.with_index(1) do |item, i|
puts "#{i}: #{item}"
endReturnera en Enumerator från each
I egna klasser returnerar ni to_enum(:each) (eller enum_for) när inget block har angetts, så att anroparen kan iterera externt.
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.nextSätta ihop allt
Enumeratorer ger detaljerad kontroll:
- Hämta värden med
next, förhandsgranska eller spola tillbaka. - Skapa egna med
Enumerator.newoch en yielder. - De är Enumerable, så map/select/take fungerar alla.
odds = Enumerator.new do |y|
n = 1
loop { y << n; n += 2 }
end
p odds.first(4)Snabbtest
Testa er förståelse av Enumerator-objekt.
Sammanfattning
Ni har lärt er om Enumerator-objekt:
- Extern iteration med
next,peekochrewind. StopIterationsignalerar slutet.- Skapa egna med
Enumerator.new { |y| ... }. - De är Enumerable och kan vara oändliga.
nums = Enumerator.new { |y| 1.upto(3) { |n| y << n } }
puts nums.next
puts nums.nextLär dig Ruby med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 29
- Lektioner
- 109
Vanliga frågor
Är lektionen ”Enumerator-objekt” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Ruby Academy, inklusive ”Enumerator-objekt”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Ruby Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Enumerator-objekt”?
Extern iteration. Ni övar på Ruby Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Ruby Academy?
Du behöver inga förkunskaper. Utbildningen i Ruby Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Enumerator-objekt”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Ruby Academy-lektionen?
Ja. Varje Ruby Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Skriv en egen each
- Inkludera Enumerable
- Lata enumeratorer
- Enumerator-objekt