Ruby中元类的Base和Derived类之间的关系是什么?

Ruby中,我们可以在singleton方法中使用super来调用相应的超类的单例方法,如下面的代码所示.
class Base
  def self.class_method
    puts "Base class method"
  end
end

class Derived < Base
  def self.class_method
    puts "Derived class method"
    super
  end
end

Derived.class_method
# Derived class method
# Base class method

但是,我似乎并不完全了解Derived.class_method中对super的调用是如何达到Base.class_method的.我假设class_method是在他们的元类上定义的,这是否意味着他们的元类有父/子关系? (我无法通过实验确认)

更新:我问的是这个问题,因为我记得在某个地方看到基地和派生类’元类之间存在某种关系(但我再也找不到了).除了知道实际超级如何工作之外,我还想确认两个元类是否完全分开.

解决方法

这里有四个类对象:
<Class>---class---><Class>
Base               #Base
   ^                  ^
   |                  |
   |                  |
 super              super
   |                  |
   |                  |
<Class>            <Class>
Derived---class--->#Derived

命名:

>< ...>是每个对象的类.
>该类的名称位于第二行.
>如果名称以#开头,则它是本征类(也称为单例类).
>超级指向一个班级的超类
> class指向类的类.

当您调用Derived.class_method时,Ruby遵循“正确的一个然后向上”规则:首先转到对象的类,然后按照超类链,在找到方法时停止:

>“class_method”调用的接收者是Derived.因此,请遵循链接到Derived的类对象,这是它的特征类(#Derived).
> Derived没有定义方法,因此Ruby跟随链链接到#Derived的超类,即#Base.
>该方法在那里找到,因此Ruby将消息分派给#Base.class_method

你不觉得我知道所有这些东西都是我的头脑,是吗?在这里,我的大脑得到了所有这些元juju:Metaprogramming Ruby.

第2部分.如何使“特征类”(又名“单身类”)脱离隐藏

class Object
  def eigenclass
    class << self
      self
    end
  end
end

方法将返回任何对象的本征类.现在,课程怎么样?那些也是对象.

p Derived.eigenclass               # => #<Class:Derived>
p Derived.eigenclass.superclass    # => #<Class:Base>
p Base.eigenclass                  # => #<Class:Base>

注意:上面是Ruby1.9.在Ruby 1.8下运行时,你会感到惊讶:

p Derived.eigenclass.superclass    # => #<Class:Class>

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...