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 举报,一经查实,本站将立刻删除。