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


85

假设我有一个类,A并且B在哪里B继承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

谢谢 :)


4
像这样卡住时,请始终尝试B.methods.sort使用irb。也许有些东西会为您提供有关所寻找方法名称的线索。
Ivaylo Strandjev

@IvayloStrandjev那将无济于事。有太多方法可供浏览。浪费时间。
sawa 2013年

@sawa不正确。花了我30秒。其他用户可以比我快,但相当快。
Ivaylo Strandjev

8
@checkit:简单得多!8.methods.grep(/class/)您甚至都不需要使用这种过滤进行排序:)
Sergio Tulentsev

@SergioTulentsev不错!这将非常有帮助:)
Rahul Tapali

Answers:



62

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

object.class.ancestors

例如:

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

1
请记住,其中还包括类中包含的模块。您可以看到,Array其后Enumerable不是父对象,而是Array包含的模块。如果只需要类,则可以执行Array.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject]
3limin4t0r

18

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

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

16

万一google将任何在Rails中工作的人带到这里,您可能想要的是base_class,因为它superclass也会遍历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

更进一步...

class C < B
end

> C.base_class
=> A

换句话说,base_class为您提供了继承树的顶部,但仅限于应用程序的上下文。但是,就Rails而言,公平的警告是“您的应用程序”包括您正在使用的所有gem,因此,如果您有一个模型继承了gem中定义的某些东西,base_class则将返回gem的类,而不是您的类。


8

您要查找的术语是superclass。事实上,你可以做B.superclass来获得A。(您还B.ancestors可以获取其继承的所有类和模块的列表,例如[B, A, Object, Kernel, BasicObject]。)


2

继承是两个类之间的关系。继承在类之间创建父子关系。它是一种代码重用机制,并允许通过公共类和接口对原始软件进行独立扩展。继承的好处是,层次结构中较低的类可以获得较高者的功能,但也可以添加自己的特定功能。

在Ruby中,一个类只能从一个其他类继承。(即,一个类可以继承自另一个类的类,而另一个类又继承另一个类,但是单个类不能一次继承多个类)。BasicObject类是Ruby中所有类的父类。因此,除非明确重写,否则其方法可用于所有对象。

Ruby通过使用mixin一次克服了单类继承。

我将尝试用一个例子来解释。

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进行跟踪,并执行此过程,除非您在此层次结构中找到BasicOject。BasicObject是每个类的超类。让我们假设我们想看到C类层次树。

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

您可以看到C类的整个层次结构。使用这种方法要注意的是,您不会找到父类中包含或添加的模块。

还有另一种方法来查找包括模块在内的完整层次结构。根据Ruby文档祖先的说法。返回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_(面向对象编程)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.