0Pricing
Ruby Academy · Lezione

Scrivere un metodo each personalizzato

Implementare l'iterazione

Scrivere un metodo each personalizzato è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Ruby Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Ruby Academy include 4 lezioni in totale.

Implementare l'iterazione

L'iterazione di Ruby ruota attorno a un solo metodo: each. Scrivendo il proprio each, si decide come attraversare una collezione e si sblocca l'intero ecosistema dell'iterazione.

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

each passa i valori

All'interno di each, si chiami yield una volta per ogni elemento. Il blocco fornito dal chiamante riceve ogni valore a turno.

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

Memorizzare i dati interni

Di solito each attraversa i dati contenuti in una variabile di istanza.

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 }

Ordine di attraversamento personalizzato

Il proprio each può iterare nell'ordine desiderato, ad esempio in ordine inverso.

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 }

Passare più valori con yield

yield può passare più di un valore, che il blocco riceve come parametri distinti, ad esempio la chiave e il valore di un hash.

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

each restituisce self

Per convenzione, each restituisce la collezione stessa, così è possibile concatenare le chiamate. Restituire self da each riproduce il comportamento integrato.

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

Usare block_given?

È opportuno gestire l'assenza di un blocco, così una chiamata a each senza blocco non va in errore, spesso restituendo un enumeratore, che verrà trattato più avanti.

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

Usare each per altri metodi

Una volta definito each, è possibile costruirci sopra altri metodi all'interno della stessa classe.

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

Sequenze calcolate

each non deve necessariamente memorizzare qualcosa: può generare i valori al volo.

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 }

La base di Enumerable

Il proprio each è l'unico elemento costitutivo di cui ha bisogno Enumerable. Nella prossima lezione lo includerà e otterrà gratuitamente decine di metodi.

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

Mettere tutto insieme

Un each personalizzato offre il pieno controllo dell'iterazione:

  • yield viene chiamato una volta per elemento.
  • È possibile attraversare gli elementi in qualsiasi ordine, generare valori o passare coppie.
  • Per convenzione, si restituisce self.
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 }

Verifica rapida

Verifichi la propria comprensione di each personalizzato.

Riepilogo

Ha imparato a scrivere un each personalizzato:

  • yield passa gli elementi al blocco del chiamante.
  • Si controlla l'ordine di attraversamento e si possono generare valori.
  • Per convenzione, si restituisce self.
  • each è la base di 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 }

Domande Frequenti

La lezione «Scrivere un metodo each personalizzato» è gratuita?

Sì — il testo completo di «Scrivere un metodo each personalizzato» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Ruby Academy, passa a CoddyKit PRO. Il corso Ruby Academy include 4 lezioni in totale.

Cosa imparerò in «Scrivere un metodo each personalizzato»?

Implementare l'iterazione Eserciti Ruby Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Ruby Academy?

Non è richiesta alcuna esperienza precedente. Ruby Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Scrivere un metodo each personalizzato»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Ruby Academy?

Sì. Ogni lezione Ruby Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Scrivere un metodo each personalizzato
  2. Includere Enumerable
  3. Enumerator lazy
  4. Oggetti Enumerator
← Torna a Ruby Academy