微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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>

原文地址:https://www.jb51.cc/ruby/267259.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐