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