prepend und Methodenauflösung
Vererbungsketten
prepend und Methodenauflösung ist eine kostenlose Ruby Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Ruby Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Ruby Academy-Kurs umfasst insgesamt 4 Lektionen.
Ahnenketten
Wenn Sie eine Methode aufrufen, durchsucht Ruby eine Liste, die als Ahnenkette bezeichnet wird. Die erste passende Definition wird verwendet. Wenn Sie diese Kette verstehen, wird klar, wie Mixins und Vererbung zusammenspielen.
class Animal; end
class Dog < Animal; end
p Dog.ancestorsReihenfolge der Methodensuche
Ruby sucht zuerst in der Klasse des Objekts, dann in den eingebundenen Modulen, anschließend in der Oberklasse und so weiter entlang der Kette, bis die Methode gefunden wird.
module M
def hello; "from module"; end
end
class C
include M
def hello; "from class"; end
end
puts C.new.helloinclude steht unterhalb der Klasse
Ein per include eingebundenes Modul steht in der Kette direkt unterhalb der Klasse. Die eigenen Methoden der Klasse haben Vorrang vor denen des Moduls.
module M; end
class C
include M
end
p C.ancestors # [C, M, Object, ...]prepend kennenlernen
prepend fügt ein Modul in der Kette oberhalb der Klasse ein. Dadurch werden die Methoden des Moduls zuerst gefunden, noch vor den eigenen Methoden der Klasse.
module M
def hello; "from module"; end
end
class C
prepend M
def hello; "from class"; end
end
puts C.new.helloprepend in der Kette
Untersuchen Sie die Vorfahren, um zu sehen, dass prepend das Modul vor der Klasse platziert.
module M; end
class C
prepend M
end
p C.ancestors # [M, C, Object, ...]super aus einem per prepend eingebundenen Modul
Da das vorangestellte Modul zuerst ausgeführt wird, kann es die Klassenmethode umschließen, indem es mit super das Original aufruft. Das eignet sich ideal zum Dekorieren von Verhalten.
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 in Mixins
super folgt der Ahnenkette. Aus einem eingebundenen Modul erreicht super die Oberklasse; aus einem vorangestellten Modul erreicht es die Klasse selbst.
module Polite
def greet; "Hi! " + super; end
end
class Person
prepend Polite
def greet; "I am here."; end
end
puts Person.new.greetUmschließen ohne Bearbeitung
Mit prepend können Sie bestehende Methoden um zusätzliches Verhalten ergänzen, ohne den ursprünglichen Klassencode zu ändern. Das ist eine saubere Alternative zum 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)Reihenfolge mehrerer Module
Wenn mehrere Module eingebunden werden, steht das zuletzt eingebundene Modul der Klasse am nächsten und wird zuerst durchsucht.
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.ancestorsZusammenfassung: include und prepend
Direkt gegenübergestellt:
include M: Die Kette lautet[Class, M, ...]— Methoden der Klasse haben Vorrang.prepend M: Die Kette lautet[M, Class, ...]— Methoden des Moduls haben Vorrang und können mitsuperin die Klasse gelangen.
module M; end
class Inc; include M; end
class Pre; prepend M; end
p Inc.ancestors
p Pre.ancestorsAlles zusammenführen
Die Methodenauflösung folgt der Ahnenkette:
- Klassenmethoden haben Vorrang vor eingebundenen Modulen.
- Vorangestellte Module haben Vorrang vor der Klasse.
supergeht in der Kette einen Schritt nach oben.
module Cap
def name; super.capitalize; end
end
class User
prepend Cap
def name; "ada"; end
end
puts User.new.nameKurzer Test
Testen Sie Ihr Verständnis der Methodenauflösung.
Zusammenfassung
Sie haben die Methodenauflösung kennengelernt:
- Ruby durchsucht die Ahnenkette von oben nach unten.
includesteht unterhalb der Klasse,prependoberhalb.supererreicht die nächste Definition weiter oben in der Kette.prependkann Methoden sauber umschließen.
module Loud
def speak; super.upcase; end
end
class Bot
prepend Loud
def speak; "beep"; end
end
puts Bot.new.speakHäufig gestellte Fragen
Ist die Lektion „prepend und Methodenauflösung“ kostenlos?
Ja — der vollständige Text von „prepend und Methodenauflösung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Ruby Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Ruby Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „prepend und Methodenauflösung“?
Vererbungsketten Du übst Ruby Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Ruby Academy zu starten?
Keine Vorkenntnisse erforderlich. Ruby Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „prepend und Methodenauflösung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Ruby Academy-Lektion Code schreiben und ausführen?
Ja. Jede Ruby Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Module definieren
- include und extend
- Comparable und Enumerable
- prepend und Methodenauflösung