重新打开(猴子修补)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