Ruby Academy · Lektion

Enumerator-objekter

Ekstern iteration

Lektion 4 af 413 trin

Enumerator-objekter er en gratis Ruby Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Ruby Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Ruby Academy-kurset indeholder 4 lektioner i alt.

Ekstern iteration

En Enumerator er et objekt, der repræsenterer en iteration. Den understøtter ekstern iteration: Du henter værdier én ad gangen med next i stedet for at give en blok til each.

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

Hent en Enumerator

Kald en iteratormetode som each uden en blok, så modtager du en Enumerator i stedet for at køre metoden.

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

Hent med next

next returnerer det næste element, hver gang du kalder den. Enumerator husker sin placering.

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

StopIteration ved slutningen

Når der ikke er flere værdier, kaster next StopIteration. Du kan håndtere undtagelsen for at stoppe på en ren måde.

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

peek og rewind

peek ser på den næste værdi uden at gå videre, mens rewind nulstiller til begyndelsen.

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

Opret brugerdefinerede Enumerators

Opret din egen med Enumerator.new. Blokken modtager en yielder y; send værdier 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

Uendelige Enumerators

Fordi de er baseret på hentning, kan brugerdefinerede Enumerators være uendelige. Du henter kun det, du har brug for.

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

Enumerators er Enumerable

En Enumerator inkluderer Enumerable, så alle de sædvanlige metoder (map, select, take) fungerer også og gør det muligt at blande intern og ekstern iteration.

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 føjer et indeks til enhver Enumerator, eventuelt med start ved et valgfrit tal.

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

Returnér en Enumerator fra each

I dine egne klasser skal du returnere to_enum(:each) (eller enum_for), når der ikke er angivet en blok, så kalderen kan iterere eksternt.

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æt det hele sammen

Enumerator-objekter giver dig detaljeret kontrol:

  • Hent værdier med next, se den næste værdi uden at hente den med peek, eller spole tilbage med rewind.
  • Opret dine egne med Enumerator.new og en funktion, der leverer værdier.
  • De er Enumerable, så map/select/take fungerer alle sammen.
odds = Enumerator.new do |y|
  n = 1
  loop { y << n; n += 2 }
end
p odds.first(4)

Hurtigt tjek

Kontrollér din forståelse af Enumerator-objekter.

Opsummering

Du har lært om Enumerator-objekter:

  • Ekstern iteration via next, peek, rewind.
  • StopIteration angiver slutningen.
  • Opret dine egne med Enumerator.new { |y| ... }.
  • De er Enumerable og kan være uendelige.
nums = Enumerator.new { |y| 1.upto(3) { |n| y << n } }
puts nums.next
puts nums.next
Gratis at komme i gang

Lær Ruby med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
29
Lektioner
109

Ofte stillede spørgsmål

Er lektionen “Enumerator-objekter” gratis?

Ja — alle 3 lektioner i læringssporet Ruby Academy, inklusive “Enumerator-objekter”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Ruby Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Enumerator-objekter”?

Ekstern iteration Du øver dig i Ruby Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Ruby Academy?

Der kræves ingen tidligere erfaring. Ruby Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Enumerator-objekter”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Ruby Academy-lektion?

Ja. Alle Ruby Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Skriv en brugerdefineret each
  2. Inkludering af Enumerable
  3. Lazy enumerators
  4. Enumerator-objekter
← Tilbage til Ruby Academy