108 votes

Comment obtenir le nom de la classe du parent en Ruby ?

Supposons que j'ai une classe A y BB hérite de A . Comment imprimer le nom de la classe parentale dans B

class A
end

class B < A
end

Certaines choses que j'ai essayées

>> B.new.class #=> B   #which is correct
>> B.new.parent  #=> Undefined method `parent`
>> B.parent   #=> Object
>> B.parent.class #=> Class

Merci :)

158voto

Sergio Tulentsev Points 82783
class A
end

class B < A
end

B.superclass # => A
B.superclass.name # => "A"

69voto

James S. Points 951

Si vous voulez la pile d'ancêtres complète, essayez :

object.class.ancestors

Par exemple :

> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]

22voto

Joel Fouse Points 330

Au cas où Google trouverait quelqu'un ici qui travaille avec Rails, ce que vous pourriez vouloir à la place, c'est base_class comme superclass traversera également la structure d'héritage d'ActiveRecord.

class A < ActiveRecord::Base
end

class B < A
end

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

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

Encore plus loin...

class C < B
end

> C.base_class
=> A

En d'autres termes, base_class vous donne le sommet de l'arbre d'héritage mais limité au contexte de votre application. Un avertissement cependant, en ce qui concerne Rails, "votre application" inclut toutes les gemmes que vous utilisez, donc si vous avez un modèle qui sous-classe quelque chose défini dans une gemme, base_class retournera la classe de la gemme, pas la vôtre.

19voto

wwright Points 354

Pour un objet (classe instanciée), vous pouvez dériver la classe parente.

>> x = B.new
>> x.class.superclass.name
=>"A"

8voto

Chuck Points 138930

Le terme que vous recherchez est superclass . Et en effet, vous pouvez faire B.superclass pour obtenir A . (Vous pouvez également faire B.ancestors pour obtenir une liste de toutes les classes et modules dont il hérite - quelque chose comme [B, A, Object, Kernel, BasicObject] .)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X