如何在Ruby中获取父类的类名

假设我有一个类ABBinheritance了A 如何在B打印父类名称

 class A end class B < A end 

有些事情我已经尝试过了

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

谢谢 :)

 class A end class B < A end B.superclass # => A B.superclass.name # => "A" 

如果你想要完整的祖先堆栈,请尝试:

 object.class.ancestors 

例如:

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

给定一个对象(实例化类),你可以派生父类

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

如果谷歌带来了任何在Rails中工作的人,你可能想要的是base_class ,因为superclass也会遍历ActiveRecordinheritance结构。

 class A < ActiveRecord::Base end class B < A end > A.superclass => ActiveRecord::Base > B.superclass => A > A.base_class => A > B.base_class => A 

更深入…

 class C < B end > C.base_class => A 

换句话说, base_class为您提供inheritance树的顶部,但仅限于您的应用程序的上下文。 公平的警告,就Rails而言,“你的应用程序”包含了你正在使用的任何gem,所以如果你有一个模型将子类定义在gem中, base_class将返回gem的类,而不是你的。

你要找的是superclass 。 而且事实上,你可以做B.superclass得到A (你也可以做B.ancestors来获取它所inheritance的所有类和模块的列表,比如[B, A, Object, Kernel, BasicObject]

inheritance是两个类之间的关系。 inheritance在类之间创build父子关系。 它是代码重用的一种机制,允许通过公共类和接口对原始软件进行独立的扩展。inheritance的好处是下层的类可以获得更高层的特性,但也可以添加自己的特定特性。

在Ruby中,一个类只能从另外一个类inheritance。 (即一个类可以从inheritance另一个类inheritance的类inheritance,但是一个类不能同时inheritance多个类)。 BasicObject类是Ruby中所有类的父类。 因此,它的方法对所有对象都是可用的,除非明确地被覆盖。

Ruby通过使用mixin立即克服了单个类的inheritance。

我会试着用一个例子来解释。

 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 

您可以使用class_name.superclass.name进行跟踪,并执行此过程,除非您在此层次结构中find了BasicOject。 BasicObject是每个类的超类。 让我们看看假设我们想看到C类层次树。

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

您可以看到类C的整个层次结构。使用这种方法需要注意的是,您将不会发现在父类中包含或预置的模块。

还有另一种方法来查找包括模块的完整层次结构。 根据Ruby doc的祖先 。 返回mod中包含/预置的模块列表(包括mod本身)。

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

这里Mux和Kernel是模块。

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