【问题标题】:How do I get the parent's class name in Ruby如何在 Ruby 中获取父类的类名
【发布时间】:2013-01-24 14:06:09
【问题描述】:

假设我有一个类AB,其中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

谢谢:)

【问题讨论】:

  • 当这样卡住时,总是在 irb 中尝试B.methods.sort。也许有些东西会给你一个关于你寻找的方法名称的线索。
  • @IvayloStrandjev 这无济于事。有太多的方法可以浏览。这是浪费时间。
  • @sawa 不正确。花了我30秒。足以让其他用户比我快,但相当快。
  • @checkit:简单多了! 8.methods.grep(/class/)你甚至不需要用这种过滤来排序:)
  • @SergioTulentsev 不错!!这将非常有帮助:)

标签: ruby


【解决方案1】:

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

在 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 文档 ancestors。返回 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)

【讨论】:

    【解决方案2】:

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

    object.class.ancestors
    

    例如:

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

    【讨论】:

    • 请记住,还包括类中包含的模块。可以看到Array后面跟着Enumerable,它不是父级,而是Array中包含的一个模块。如果您只想要课程,您可以执行Array.ancestors.select { |ancestor| ancestor.is_a? Class } #=&gt; [Array, Object, BasicObject] 之类的操作。
    【解决方案3】:

    如果 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 的类,而不是您的。

    【讨论】:

    • 请注意,base_class 仅在 ActiveRecord 上定义。
    【解决方案4】:

    您要查找的术语是superclass。事实上,您可以通过B.superclass 获得A。 (您也可以使用B.ancestors 来获取它继承自的所有类和模块的列表——例如[B, A, Object, Kernel, BasicObject]。)

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:
        class A
        end
        
        class B < A
        end
        
        B.superclass # => A
        B.superclass.name # => "A"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-23
          • 1970-01-01
          • 1970-01-01
          • 2012-09-03
          • 2019-08-04
          • 2011-07-07
          相关资源
          最近更新 更多