Nehmen wir an, ich habe eine Klasse A
und B
wo B
erbt A
. Wie drucke ich den Namen der übergeordneten Klasse aus?B
class A
end
class B < A
end
Einige Dinge habe ich versucht
>> B.new.class #=> B #which is correct
>> B.new.parent #=> Undefined method `parent`
>> B.parent #=> Object
>> B.parent.class #=> Class
Vielen Dank :)
B.methods.sort
in irb. Vielleicht gibt Ihnen etwas einen Hinweis auf den Methodennamen, nach dem Sie suchen.8.methods.grep(/class/)
Sie müssen nicht einmal mit dieser Art der Filterung sortieren :)Antworten:
quelle
Wenn Sie den vollständigen Ahnenstapel möchten, versuchen Sie:
Zum Beispiel:
quelle
Array
gefolgt vonEnumerable
, das kein übergeordnetes, sondern ein in Array enthaltenes Modul ist . Wenn Sie nur die Klassen wollen, können Sie so etwas tunArray.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject]
.Bei einem bestimmten Objekt (Instantiated Class) können Sie die übergeordnete Klasse ableiten
quelle
Für den Fall , bringt Google hier jemand, der in Rails funktioniert, was Sie wollen , stattdessen ist
base_class
, wiesuperclass
die Activevererbungsstruktur auch durchqueren.Noch weiter...
Mit anderen Worten,
base_class
gibt Ihnen den Anfang des Vererbungsbaums, ist jedoch auf den Kontext Ihrer Anwendung beschränkt. In Bezug auf Rails enthält "Ihre Anwendung" jedoch alle Edelsteine, die Sie verwenden. Wenn Sie also ein Modell haben, das eine in einem Edelstein definierte Unterklasse unterordnet,base_class
wird die Klasse des Edelsteins zurückgegeben, nicht Ihre.quelle
Der Begriff, den Sie suchen, ist
superclass
. Und in der Tat können Sie tunB.superclass
, um zu bekommenA
. (Sie können auchB.ancestors
eine Liste aller Klassen und Module abrufen, von denen es erbt - so etwas wie[B, A, Object, Kernel, BasicObject]
.)quelle
In Ruby kann eine Klasse nur von einer anderen Klasse erben. (dh eine Klasse kann von einer Klasse erben, die von einer anderen Klasse erbt, die von einer anderen Klasse erbt, aber eine einzelne Klasse kann nicht von vielen Klassen gleichzeitig erben). Die BasicObject-Klasse ist die übergeordnete Klasse aller Klassen in Ruby. Seine Methoden stehen daher allen Objekten zur Verfügung, sofern sie nicht ausdrücklich überschrieben werden.
Ich werde versuchen, mit einem Beispiel zu erklären.
Sie können mithilfe von class_name.superclass.name nachverfolgen und diesen Vorgang ausführen, es sei denn, Sie haben BasicOject in dieser Hierarchie gefunden. BasicObject ist eine Superklasse für jede Klasse. Nehmen wir an, wir möchten den Hierarchiebaum der Klasse C sehen.
Sie können die gesamte Hierarchie der Klasse C sehen. Beachten Sie, dass Sie bei diesem Ansatz keine Module finden, die in den übergeordneten Klassen enthalten oder vorangestellt sind.
Es gibt einen anderen Ansatz, um eine vollständige Hierarchie einschließlich Modulen zu finden. Laut Ruby Doc Vorfahren . Gibt eine Liste der in mod enthaltenen / vorangestellten Module zurück (einschließlich mod selbst).
Hier sind Mux und Kernel Module.
http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)
quelle