0Pricing
Ruby Academy · Lezione

prepend e risoluzione dei metodi

Catene di antenati

prepend e risoluzione dei metodi è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 4 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.

Catene degli antenati

Quando si chiama un metodo, Ruby cerca in un elenco chiamato catena degli antenati. Vince la prima definizione corrispondente. Comprendere questa catena spiega come interagiscono i mixin e l'ereditarietà.

class Animal; end
class Dog < Animal; end
p Dog.ancestors

Ordine di ricerca dei metodi

Ruby cerca prima nella classe dell'oggetto, poi nei moduli inclusi, quindi nella superclasse e così via lungo la catena, finché non trova il metodo.

module M
  def hello; "from module"; end
end
class C
  include M
  def hello; "from class"; end
end
puts C.new.hello

include si colloca sotto la classe

Un modulo incluso con include si colloca subito sotto la classe nella catena. I metodi della classe hanno la precedenza su quelli del modulo.

module M; end
class C
  include M
end
p C.ancestors  # [C, M, Object, ...]

Conoscere prepend

prepend inserisce un modulo sopra la classe nella catena. Ora i metodi del modulo vengono trovati per primi, prima di quelli della classe.

module M
  def hello; "from module"; end
end
class C
  prepend M
  def hello; "from class"; end
end
puts C.new.hello

prepend nella catena

Esamini gli antenati per vedere che prepend colloca il modulo prima della classe.

module M; end
class C
  prepend M
end
p C.ancestors  # [M, C, Object, ...]

super da un modulo anteposto

Poiché il modulo anteposto viene eseguito per primo, può avvolgere il metodo della classe chiamando super per raggiungere quello originale. È perfetto per decorare il comportamento.

module Logged
  def save
    puts "before save"
    result = super
    puts "after save"
    result
  end
end
class Record
  prepend Logged
  def save
    puts "saving record"
    :ok
  end
end
p Record.new.save

super nei mixin

super segue la catena degli antenati. Da un modulo incluso, super raggiunge la superclasse; da un modulo anteposto, raggiunge direttamente la classe.

module Polite
  def greet; "Hi! " + super; end
end
class Person
  prepend Polite
  def greet; "I am here."; end
end
puts Person.new.greet

Avvolgere senza modificare

prepend consente di aggiungere comportamento attorno a metodi esistenti senza modificare il codice della classe originale: è un'alternativa pulita al monkey patching.

module Timing
  def compute(n)
    puts "start"
    super
  end
end
class Calc
  prepend Timing
  def compute(n); n * n; end
end
puts Calc.new.compute(5)

Ordine di più moduli

Quando vengono inclusi diversi moduli, l'ultimo incluso si trova più vicino alla classe e viene cercato per primo.

module A; def who; "A"; end; end
module B; def who; "B"; end; end
class C
  include A
  include B
end
puts C.new.who  # B wins (included last)
p C.ancestors

Riepilogo di include e prepend

A confronto:

  • include M: la catena è [Class, M, ...] — prevalgono i metodi della classe.
  • prepend M: la catena è [M, Class, ...] — prevalgono i metodi del modulo, che possono usare super per entrare nella classe.
module M; end
class Inc; include M; end
class Pre; prepend M; end
p Inc.ancestors
p Pre.ancestors

Mettere tutto insieme

La risoluzione dei metodi segue la catena degli antenati:

  • I metodi della classe prevalgono sui moduli inclusi.
  • I moduli anteposti prevalgono sulla classe.
  • super risale di un passaggio nella catena.
module Cap
  def name; super.capitalize; end
end
class User
  prepend Cap
  def name; "ada"; end
end
puts User.new.name

Verifica rapida

Verifichi la propria comprensione della risoluzione dei metodi.

Riepilogo

Ha imparato come funziona la risoluzione dei metodi:

  • Ruby cerca nella catena degli antenati dall'alto verso il basso.
  • include si trova sotto la classe; prepend si trova sopra di essa.
  • super raggiunge la definizione successiva nella catena.
  • prepend consente di avvolgere i metodi in modo pulito.
module Loud
  def speak; super.upcase; end
end
class Bot
  prepend Loud
  def speak; "beep"; end
end
puts Bot.new.speak

Domande Frequenti

La lezione «prepend e risoluzione dei metodi» è gratuita?

Sì — il testo completo di «prepend e risoluzione dei metodi» è 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 «prepend e risoluzione dei metodi»?

Catene di antenati 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 4 di 4.

Quanto tempo richiede la lezione «prepend e risoluzione dei metodi»?

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