根据戴夫托马斯在his talk about the Ruby Object Model,Ruby中没有“类方法”。方法的接收者是“类对象”还是“实例对象”之间只有区别。继承在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]
下会创建一个新的eigenclass为B
:
p B.metaclass.ancestors
# => [Class, Module, Object, Kernel, BasicObject]
p B.metaclass.instance_method(false)
# => []
将如何
B.ancestors
和B.metaclass.ancestors
的样子时,也被包括在eigenclasses?方法say_hello
存储在本征类(我假设B.class
继承自),但它在哪里?由于有两个祖先链(
B.ancestors
和B.class.ancestors
或B.metaclass.ancestors
),继承是如何发生的?