0Pricing
Ruby Academy · Lezione

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.inspect

Comparable 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).inspect

Enumerable 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).inspect

Aggregazioni 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.count

select 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.first

Mettere tutto insieme

I mixin standard ricompensano un contratto minimo:

  • Comparable: definisca <=> per ottenere tutti i confronti.
  • Enumerable: definisca each per 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.inspect

Verifica rapida

Verifichi la propria comprensione dei mixin standard.

Riepilogo

Ha imparato a usare i mixin standard:

  • Comparable richiede <=> e offre confronti, clamp e between?.
  • Enumerable richiede each e 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

  1. Definire moduli
  2. include e extend
  3. Comparable ed Enumerable
  4. prepend e risoluzione dei metodi
← Torna a Ruby Academy