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