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.ancestorsOrdine 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.helloinclude 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.helloprepend 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.savesuper 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.greetAvvolgere 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.ancestorsRiepilogo 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 usaresuperper entrare nella classe.
module M; end
class Inc; include M; end
class Pre; prepend M; end
p Inc.ancestors
p Pre.ancestorsMettere 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.
superrisale 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.nameVerifica 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.
includesi trova sotto la classe;prependsi trova sopra di essa.superraggiunge la definizione successiva nella catena.prependconsente 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.speakDomande 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
- Definire moduli
- include e extend
- Comparable ed Enumerable
- prepend e risoluzione dei metodi