bry*_*sai 6 ruby metaprogramming metaclass
在Ruby中,我们可以使用supersingleton方法来调用相应的超类的单例方法,如下面的代码所示.
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
Run Code Online (Sandbox Code Playgroud)
但是,我似乎并不完全了解super内部的呼吁Derived.class_method可以达到的程度Base.class_method.我假设它class_method是在他们的元类上定义的,这是否意味着他们的元类有父/子关系?(我无法通过实验确认)
更新:我问的是这个问题,因为我记得在某个地方看到基地和派生类'元类之间存在某种关系(但我再也找不到了).除了知道实际如何super工作之外,我还想确认这两个元类是否完全分开.
Way*_*rad 11
这里有四个类对象:
<Class>---class---><Class>
Base #Base
^ ^
| |
| |
super super
| |
| |
<Class> <Class>
Derived---class--->#Derived
Run Code Online (Sandbox Code Playgroud)
命名:
当您调用Derived.class_method时,Ruby遵循"正确的一个然后向上"规则:首先转到对象的类,然后按照超类链,在找到方法时停止:
你不觉得我知道所有这些东西都是我的头脑,是吗?在这里,我的大脑得到了所有这些元juju:Metaprogramming Ruby.
第2部分. 如何使"特征类"(又名"单身类")脱离隐藏
class Object
def eigenclass
class << self
self
end
end
end
Run Code Online (Sandbox Code Playgroud)
此方法将返回任何对象的本征类.现在,课程怎么样?那些也是对象.
p Derived.eigenclass # => #<Class:Derived>
p Derived.eigenclass.superclass # => #<Class:Base>
p Base.eigenclass # => #<Class:Base>
Run Code Online (Sandbox Code Playgroud)
注意:上面是Ruby1.9.在Ruby 1.8下运行时,你会感到惊讶:
p Derived.eigenclass.superclass # => #<Class:Class>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
809 次 |
| 最近记录: |