【发布时间】:2012-12-18 16:28:30
【问题描述】:
根据his talk about the Ruby Object Model 中的 Dave Thomas 所说,Ruby 中没有“类方法”。只是方法的接收者是“类对象”还是“实例对象”的区别。
class Dave
def InstaceMethod ### will be stored in the current class (Dave)
puts "Hi"
end
class << self ### Creates an eigenclass, if not created before
def say_hello
puts "Hello"
end
end
end
默认情况下,ancestors 方法不显示元类:
class Dave
class << self
def metaclass ### A way to show the hidden eigenclass
class << self; self; end
end
end
end
p Dave.ancestors
# => [Dave, Object, Kernel, BasicObject]
p Dave.metaclass.ancestors
# => [Class, Module, Object, Kernel, BasicObject]
但是,我认为真正的应该是这样的:
# => [<eigenclass>, Class, Module, Object, Kernel, BasicObject]
p Dave.class.instance_method(false)
# => [:allocate, :new, :superclass]
p Dave.metaclass.instance_method(false)
# => [:say_hello, :metaclass]
现在是继承。
class B < Dave
end
p B.say_hello
# => "Hello"
p B.ancestors
# => [B, Dave, Object, Kernel, BasicObject]
p B.class.instance_methods(false)
# => [:allocate, :new, :superclass]
以下将为B 创建一个新的特征类:
p B.metaclass.ancestors
# => [Class, Module, Object, Kernel, BasicObject]
p B.metaclass.instance_method(false)
# => []
如果还包含特征类,
B.ancestors和B.metaclass.ancestors会是什么样子?方法say_hello存储在一个特征类中(我假设B.class继承自),但它在哪里?既然有两个祖先链(
B.ancestors和B.class.ancestors或B.metaclass.ancestors),那么继承实际上是如何发生的?
【问题讨论】:
标签: ruby oop inheritance metaclass eigenclass