Ruby Academy · leksjon

Skrive egen each

Implementer iterasjon

Leksjon 1 av 413 trinn

Skrive egen each er en gratis leksjon i Ruby Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Ruby Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Ruby Academy inneholder totalt 4 leksjoner.

Implementer iterasjon

Iterasjon i Ruby dreier seg om én metode: each. Ved å skrive din egen each bestemmer du hvordan en samling gjennomgås, og får tilgang til hele økosystemet for iterasjon.

class Trio
  def each
    yield 1
    yield 2
    yield 3
  end
end
Trio.new.each { |n| puts n }

each gir verdier

Inne i each kaller du yield én gang per element. Blokken som den som kaller metoden, oppgir, mottar hver verdi etter tur.

class Days
  NAMES = ["Mon", "Tue", "Wed"]
  def each
    NAMES.each { |d| yield d }
  end
end
Days.new.each { |day| puts day }

Lagre interne data

Vanligvis går each gjennom data som ligger i en instansvariabel.

class Stack
  def initialize
    @items = []
  end
  def push(x); @items << x; self; end
  def each
    @items.each { |i| yield i }
  end
end
s = Stack.new
s.push(10).push(20)
s.each { |x| puts x }

Egendefinert gjennomløpsrekkefølge

Din each kan iterere i den rekkefølgen du ønsker, for eksempel i omvendt rekkefølge.

class Reversed
  def initialize(arr); @arr = arr; end
  def each
    i = @arr.length - 1
    while i >= 0
      yield @arr[i]
      i -= 1
    end
  end
end
Reversed.new([1, 2, 3]).each { |x| puts x }

Gi flere verdier

yield kan sende mer enn én verdi, som blokken mottar som flere parametere, for eksempel nøkkelen og verdien i en hash.

class Pairs
  def each
    yield :a, 1
    yield :b, 2
  end
end
Pairs.new.each { |key, value| puts "#{key}=#{value}" }

each returnerer self

Etter konvensjonen returnerer each selve samlingen, slik at kall kan lenkes. Når each returnerer self, samsvarer det med oppførselen til innebygde metoder.

class Box
  def initialize(*x); @x = x; end
  def each
    @x.each { |i| yield i }
    self
  end
end
result = Box.new(1, 2).each { |i| }
puts result.class

Bruk av block_given?

Beskytt koden mot en manglende blokk, slik at et each uten blokk ikke krasjer. Dette gjøres ofte ved å returnere en enumerator, som du lærer om senere.

class List
  def initialize(*x); @x = x; end
  def each
    return @x.to_enum unless block_given?
    @x.each { |i| yield i }
  end
end
puts List.new(5, 6).each.class

Bygg andre metoder

Når each finnes, kan du bygge andre metoder oppå den i samme klasse.

class Numbers
  def initialize(*n); @n = n; end
  def each; @n.each { |i| yield i }; end
  def total
    sum = 0
    each { |i| sum += i }
    sum
  end
end
puts Numbers.new(1, 2, 3, 4).total

Beregnede sekvenser

each trenger ikke å lagre noe; den kan generere verdier underveis.

class Evens
  def initialize(limit); @limit = limit; end
  def each
    n = 0
    while n <= @limit
      yield n
      n += 2
    end
  end
end
Evens.new(8).each { |x| puts x }

Grunnlaget for Enumerable

Din each er den eneste byggesteinen Enumerable trenger. I neste leksjon inkluderer du den og får dusinvis av metoder uten ekstra arbeid.

class Range3
  def each
    (1..3).each { |n| yield n }
  end
end
Range3.new.each { |n| print n }
puts

Sett det hele sammen

Med en egendefinert each får du full kontroll over iterasjonen:

  • yield én gang per element.
  • Gå gjennom verdier i valgfri rekkefølge, generer verdier eller gi par.
  • Returner self etter konvensjonen.
class Countdown
  def initialize(from); @from = from; end
  def each
    @from.downto(1) { |n| yield n }
  end
end
Countdown.new(3).each { |n| puts n }

Rask sjekk

Test forståelsen din av egendefinert each.

Oppsummering

Du har lært å skrive en egendefinert each:

  • yield sender elementer til blokken som kaller metoden.
  • Du styrer gjennomløpsrekkefølgen og kan generere verdier.
  • Returner self etter konvensjonen.
  • each er grunnlaget for Enumerable.
class Squares
  def initialize(n); @n = n; end
  def each
    (1..@n).each { |i| yield i * i }
  end
end
Squares.new(4).each { |sq| puts sq }
Gratis å komme i gang

Lær deg Ruby med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
29
Leksjoner
109

Ofte stilte spørsmål

Er leksjonen «Skrive egen each» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Ruby Academy, inkludert «Skrive egen each», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Ruby Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Skrive egen each»?

Implementer iterasjon Du øver på Ruby Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Ruby Academy?

Ingen tidligere erfaring er nødvendig. Ruby Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Skrive egen each»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Ruby Academy-leksjonen?

Ja. Alle Ruby Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Skrive egen each
  2. Inkludere Enumerable
  3. Late enumeratorer
  4. Enumerator-objekter
← Tilbake til Ruby Academy