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.classUsare 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.classUsare 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).totalSequenze 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 }
putsMettere tutto insieme
Un each personalizzato offre il pieno controllo dell'iterazione:
yieldviene 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:
yieldpassa 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
- Scrivere un metodo each personalizzato
- Includere Enumerable
- Enumerator lazy
- Oggetti Enumerator