在
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>