Ruby Academy · Oppitunti

Enumerator-oliot

Ulkoinen iteraatio.

Oppitunti 4/413 vaihetta

Enumerator-oliot on ilmainen Ruby Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Ruby Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Ruby Academy-kurssilla on yhteensä 4 oppituntia.

Ulkoinen iteraatio

Enumerator on iteraatiota edustava olio. Se tukee ulkoista iteraatiota: noudat arvot yksi kerrallaan next-metodilla sen sijaan, että välittäisit lohkon each-metodille.

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

Enumeraattorin hankkiminen

Kutsu iteraattorimetodia, kuten each-metodia, ilman lohkoa, niin saat suorituksen sijaan Enumerator-olion.

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

Arvojen noutaminen next-metodilla

next palauttaa seuraavan alkion jokaisella kutsukerralla. Enumerator muistaa sijaintinsa.

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

StopIteration lopussa

Kun arvot loppuvat, next nostaa StopIteration-poikkeuksen. Voit käsitellä sen rescue-lauseella lopettaaksesi hallitusti.

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

peek ja rewind

peek tarkastelee seuraavaa arvoa etenemättä, ja rewind palauttaa aloituskohtaan.

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

Mukautettujen enumeraattorien rakentaminen

Luo oma enumeraattori komennolla Enumerator.new. Lohko vastaanottaa yielder-olion y; työnnä arvoja käyttämällä y <<- tai y.yield-toimintoa.

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

Äärettömät enumeraattorit

Koska mukautetut Enumerator-oliot perustuvat arvojen noutamiseen, ne voivat olla äärettömiä. Otat niistä vain tarvitsemasi arvot.

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

Enumeratorit ovat Enumerable-olioita

Enumerator sisältää Enumerable-mixin, joten kaikki tavalliset metodit, kuten map, select ja take, toimivat myös. Näin sisäinen ja ulkoinen iteraatio voidaan yhdistää.

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 liittää indeksin mihin tahansa Enumerator-olioon. Aloitusindeksiksi voi halutessaan määrittää mukautetun numeron.

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

Enumeraattorin palauttaminen each-metodista

Palauta omissa luokissasi to_enum(:each) (tai enum_for), kun lohkoa ei anneta, jotta kutsujat voivat iteroida ulkoisesti.

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

Kootaan kaikki yhteen

Enumerator-oliot antavat tarkan hallinnan:

  • Hakekaa arvoja next-menetelmällä, kurkistakaa seuraavaa arvoa tai kelatkaa alkuun.
  • Luokaa mukautettuja olioita Enumerator.new-menetelmällä ja yielder-olion avulla.
  • Ne ovat Enumerable-olioita, joten map-, select- ja take-menetelmät toimivat niiden kanssa.
odds = Enumerator.new do |y|
  n = 1
  loop { y << n; n += 2 }
end
p odds.first(4)

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte Enumerator-oliot.

Kertaus

Opitte käyttämään Enumerator-olioita:

  • Ulkoiseen iterointiin menetelmillä next, peek ja rewind.
  • StopIteration ilmaisee lopun.
  • Luokaa mukautettuja olioita muodolla Enumerator.new { |y| ... }.
  • Ne ovat Enumerable-olioita ja voivat olla rajattomia.
nums = Enumerator.new { |y| 1.upto(3) { |n| y << n } }
puts nums.next
puts nums.next
Aloita maksutta

Opi Ruby tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
29
Oppitunnit
109

Usein kysytyt kysymykset

Onko oppitunti ”Enumerator-oliot” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Ruby Academy-oppimispolun 3 oppituntia, myös oppitunnin “Enumerator-oliot”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Ruby Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Enumerator-oliot”?

Ulkoinen iteraatio. Harjoittelet Ruby Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Ruby Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Ruby Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Enumerator-oliot”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Ruby Academy-oppitunnilla?

Kyllä. Jokainen Ruby Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Mukautetun each-metodin kirjoittaminen
  2. Enumerable-moduulin sisällyttäminen
  3. Laiskat enumeratorit
  4. Enumerator-oliot
← Takaisin: Ruby Academy