Wie erhalte ich den Klassennamen der Eltern in Ruby?

83

Nehmen wir an, ich habe eine Klasse Aund Bwo Berbt 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 :)

Rahul Tapali
quelle
4
wenn du so feststeckst, versuche es immer B.methods.sortin irb. Vielleicht gibt Ihnen etwas einen Hinweis auf den Methodennamen, nach dem Sie suchen.
Ivaylo Strandjev
@IvayloStrandjev Das wird nicht helfen. Es gibt zu viele Methoden, um sie durchzusehen. Es ist Zeitverschwendung.
Sawa
@sawa nicht wahr. Hat 30 Sekunden gedauert. Genug für andere Benutzer, um schneller als ich zu sein, aber ziemlich schnell.
Ivaylo Strandjev
8
@checkit: viel einfacher! 8.methods.grep(/class/)Sie müssen nicht einmal mit dieser Art der Filterung sortieren :)
Sergio Tulentsev
@SergioTulentsev schön !! es wird wirklich hilfreich sein :)
Rahul Tapali

Antworten:

131
class A
end

class B < A
end

B.superclass # => A
B.superclass.name # => "A"
Sergio Tulentsev
quelle
62

Wenn Sie den vollständigen Ahnenstapel möchten, versuchen Sie:

object.class.ancestors

Zum Beispiel:

> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
James S.
quelle
1
Beachten Sie, dass dies auch Module umfasst, die in einer Klasse enthalten sind. Sie können sehen, Arraygefolgt von Enumerable, das kein übergeordnetes, sondern ein in Array enthaltenes Modul ist . Wenn Sie nur die Klassen wollen, können Sie so etwas tun Array.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject].
3limin4t0r
18

Bei einem bestimmten Objekt (Instantiated Class) können Sie die übergeordnete Klasse ableiten

>> x = B.new
>> x.class.superclass.name
=>"A"
wwright
quelle
16

Für den Fall , bringt Google hier jemand, der in Rails funktioniert, was Sie wollen , stattdessen ist base_class, wie superclassdie Activevererbungsstruktur auch durchqueren.

class A < ActiveRecord::Base
end

class B < A
end

> A.superclass
=> ActiveRecord::Base
> B.superclass
=> A

> A.base_class
=> A
> B.base_class
=> A

Noch weiter...

class C < B
end

> C.base_class
=> A

Mit anderen Worten, base_classgibt 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_classwird die Klasse des Edelsteins zurückgegeben, nicht Ihre.

Joel Fouse
quelle
8

Der Begriff, den Sie suchen, ist superclass. Und in der Tat können Sie tun B.superclass, um zu bekommen A. (Sie können auch B.ancestorseine Liste aller Klassen und Module abrufen, von denen es erbt - so etwas wie [B, A, Object, Kernel, BasicObject].)

Futter
quelle
2

Vererbung ist eine Beziehung zwischen zwei Klassen. Vererbung erstellt eine übergeordnete untergeordnete Beziehung zwischen Klassen. Es ist ein Mechanismus zur Wiederverwendung von Code und zur Ermöglichung unabhängiger Erweiterungen der ursprünglichen Software über öffentliche Klassen und Schnittstellen. Der Vorteil der Vererbung besteht darin, dass Klassen in der unteren Hierarchie die Funktionen der höheren Klassen erhalten, aber auch eigene spezifische Funktionen hinzufügen können .

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.

Ruby überwindet die Einzelklassenvererbung sofort mithilfe des Mixins.

Ich werde versuchen, mit einem Beispiel zu erklären.

module Mux
 def sam
  p "I am an module"
 end
end
class A
  include Mux
end
class B < A
end
class C < B
end
class D < A
end

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.

 C.superclass
   => B
 B.superclass
  => A
 A.superclass
  => Object
 Object.superclass
  => BasicObject

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

C.ancestors
 => [C, B, A, Mux, Object, Kernel, BasicObject]

Hier sind Mux und Kernel Module.

http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

Mukesh Kumar Gupta
quelle