Singleton 类的消息传播
实例永远不会包含只携带数据的方法。但是,我们可以为任何对象定义单例类,包括类的实例。
当一个消息传递给一个对象(方法被调用)时,Ruby 首先检查是否为该对象定义了一个单独的类,以及它是否可以回复该消息,否则 Ruby 会检查实例的类’祖先链并对其进行处理。
class Example
def foo
:example
end
end
Example.new.foo #=> :example
module PrependedModule
def foo
:prepend
end
end
class Example
prepend PrependedModule
end
Example.ancestors #=> [Prepended, Example, Object, Kernel, BasicObject]
e = Example.new
e.foo #=> :prepended
def e.foo
:singleton
end
e.foo #=> :singleton