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 命名: >< ...>是每个对象的类. 当您调用Derived.class_method时,Ruby遵循“正确的一个然后向上”规则:首先转到对象的类,然后按照超类链,在找到方法时停止: >“class_method”调用的接收者是Derived.因此,请遵循链接到Derived的类对象,这是它的特征类(#Derived). 你不觉得我知道所有这些东西都是我的头脑,是吗?在这里,我的大脑得到了所有这些元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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |