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

Rah*_*ali 76 ruby

让我们假设我有一个类AB那里B继承A.如何在中打印父类名称B

class A
end

class B < A
end
Run Code Online (Sandbox Code Playgroud)

我试过的一些事情

>> B.new.class #=> B   #which is correct
>> B.new.parent  #=> Undefined method `parent`
>> B.parent   #=> Object
>> B.parent.class #=> Class
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

Ser*_*sev 120

class A
end

class B < A
end

B.superclass # => A
B.superclass.name # => "A"
Run Code Online (Sandbox Code Playgroud)


Jam*_* S. 57

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

object.class.ancestors
Run Code Online (Sandbox Code Playgroud)

例如:

> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)

  • 请记住,它还包括包含在类中的模块。你可以看到 `Array` 后面跟着 `Enumerable`,它不是父级,而是包含在 *Array* 中的模块。如果你只想要类,你可以做类似`Array.ancestors.select { |ancestor| 祖先.is_a?类 } #=&gt; [数组,对象,BasicObject]`。 (3认同)

小智 18

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

>> x = B.new
>> x.class.superclass.name
=>"A"
Run Code Online (Sandbox Code Playgroud)


小智 12

如果谷歌带来了任何在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
Run Code Online (Sandbox Code Playgroud)

更深入...

class C < B
end

> C.base_class
=> A
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,[`base_class`](https://api.rubyonrails.org/classes/ActiveRecord/Inheritance/ClassMethods.html#method-i-base_class)仅在`ActiveRecord`上定义。 (2认同)

Chu*_*uck 8

你正在寻找的术语是superclass.事实上,你可以做B.superclass来获得A.(您还B.ancestors可以获取它继承的所有类和模块的列表 - 类似于[B, A, Object, Kernel, BasicObject].)