Ruby Academy · Lektion

Enumerator-objekt

Extern iteration.

Lektion 4 av 413 steg

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.next

Hä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.class

Hä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.next

StopIteration 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"
end

peek 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.next

Skapa 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.next

Oä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}"
end

Returnera 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.next

Sätta ihop allt

Enumeratorer ger detaljerad kontroll:

  • Hämta värden med next, förhandsgranska eller spola tillbaka.
  • Skapa egna med Enumerator.new och 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, peek och rewind.
  • StopIteration signalerar 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.next
Gratis att börja

Lä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

  1. Skriv en egen each
  2. Inkludera Enumerable
  3. Lata enumeratorer
  4. Enumerator-objekt
← Tillbaka till Ruby Academy