重新開啟(猴子修補)Singleton 類

有三種方法可以重新開啟 Singleton 類

  • 在單例類上使用 class_eval
  • 使用 class << 塊。
  • 使用 def 直接在物件的 singleton 類上定義一個方法
class Example
end

Example.singleton_class.class_eval do
  def foo
    :foo
  end
end

Example.foo #=> :foo
class Example
end

class << Example
  def bar
    :bar
  end
end

Example.bar #=> :bar
class Example
end

def Example.baz
  :baz
end

Example.baz #=> :baz

每個物件都有一個可以訪問的單例類

class Example
end
ex1 = Example.new
def ex1.foobar
  :foobar
end
ex1.foobar #=> :foobar

ex2 = Example.new
ex2.foobar #=> NoMethodError