Comparable ed Enumerable
Mixin standard
Comparable ed Enumerable è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Mixin standard
Ruby include moduli potenti che è possibile aggiungere alle proprie classi. Due esempi di rilievo sono Comparable ed Enumerable. Ognuno fornisce molti metodi in cambio dell'implementazione di uno solo.
puts Comparable.instance_methods.sort.inspectComparable richiede <=>
Comparable richiede di definire l'operatore spaceship <=>, che restituisce -1, 0 o 1. In cambio si ottengono <, <=, ==, >, >= e between?.
class Weight
include Comparable
attr_reader :grams
def initialize(g); @grams = g; end
def <=>(other); grams <=> other.grams; end
end
puts Weight.new(50) < Weight.new(80)Metodi di confronto automatici
Definendo un solo operatore, tutti i metodi di confronto funzionano automaticamente.
class Weight
include Comparable
attr_reader :grams
def initialize(g); @grams = g; end
def <=>(other); grams <=> other.grams; end
end
a = Weight.new(100)
b = Weight.new(100)
puts a == b
puts Weight.new(30).between?(Weight.new(10), Weight.new(50))clamp da Comparable
Comparable offre anche clamp, che mantiene un valore all'interno di un intervallo.
puts 15.clamp(0, 10)
puts (-5).clamp(0, 10)
puts 7.clamp(0, 10)Ordinare oggetti Comparable
Poiché <=> è definito, un array dei propri oggetti può essere ordinato automaticamente.
class Weight
include Comparable
attr_reader :grams
def initialize(g); @grams = g; end
def <=>(other); grams <=> other.grams; end
def to_s; "#{grams}g"; end
end
list = [Weight.new(30), Weight.new(10), Weight.new(20)]
puts list.sort.map(&:to_s).inspectEnumerable richiede each
Enumerable richiede di definire each. In cambio si ottengono map, select, reduce, min, max, sort e molte altre decine di metodi.
class TodoList
include Enumerable
def initialize(*items); @items = items; end
def each(&block); @items.each(&block); end
end
list = TodoList.new("buy milk", "call mom")
puts list.map(&:upcase).inspectAggregazioni incluse gratuitamente
Una volta definito each, sono disponibili metodi di aggregazione come count, min e include?.
class Scores
include Enumerable
def initialize(*n); @n = n; end
def each(&block); @n.each(&block); end
end
s = Scores.new(8, 3, 9, 4)
puts s.max
puts s.min
puts s.countselect e reject
Sono disponibili anche metodi di filtraggio.
class Numbers
include Enumerable
def initialize(*n); @n = n; end
def each(&block); @n.each(&block); end
end
nums = Numbers.new(1, 2, 3, 4, 5, 6)
p nums.select(&:even?)
p nums.reject(&:even?)reduce per i totali
reduce (alias inject) combina gli elementi, ad esempio sommandoli.
class Basket
include Enumerable
def initialize(*p); @p = p; end
def each(&block); @p.each(&block); end
end
b = Basket.new(10, 20, 30)
puts b.reduce(0) { |sum, price| sum + price }Combinare entrambi i mixin
Aggiungendo Comparable per l'ordinamento e Enumerable per l'iterazione, la propria classe assume l'aspetto di una collezione integrata.
class Playlist
include Enumerable
def initialize(*songs); @songs = songs; end
def each(&block); @songs.each(&block); end
end
pl = Playlist.new("c", "a", "b")
puts pl.sort.inspect
puts pl.firstMettere tutto insieme
I mixin standard ricompensano un contratto minimo:
Comparable: definisca<=>per ottenere tutti i confronti.Enumerable: definiscaeachper ottenere l'intero set di strumenti per le collezioni.
class Bag
include Enumerable
def initialize(*x); @x = x; end
def each(&b); @x.each(&b); end
end
puts Bag.new(3, 1, 2).sort.inspectVerifica rapida
Verifichi la propria comprensione dei mixin standard.
Riepilogo
Ha imparato a usare i mixin standard:
Comparablerichiede<=>e offre confronti,clampebetween?.Enumerablerichiedeeache offre map, select, reduce, min, max e molto altro.- Insieme fanno apparire le classi personalizzate come classi native.
class Temp
include Comparable
attr_reader :deg
def initialize(d); @deg = d; end
def <=>(o); deg <=> o.deg; end
end
puts Temp.new(20) > Temp.new(15)Domande Frequenti
La lezione «Comparable ed Enumerable» è gratuita?
Sì — il testo completo di «Comparable ed Enumerable» è 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 «Comparable ed Enumerable»?
Mixin standard 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 3 di 4.
Quanto tempo richiede la lezione «Comparable ed Enumerable»?
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
- Definire moduli
- include e extend
- Comparable ed Enumerable
- prepend e risoluzione dei metodi