單例類

所有物件都是類的例項。然而,這不是全部真相。在 Ruby 中,每個物件也有一個隱藏的單例類

這是允許在單個物件上定義方法的原因。單例類位於物件本身與其實際類之間,因此在其上定義的所有方法都可用於該物件,並且僅適用於該物件。

object = Object.new

def object.exclusive_method
  'Only this object will respond to this method'
end

object.exclusive_method
# => "Only this object will respond to this method"

Object.new.exclusive_method rescue $!
# => #<NoMethodError: undefined method `exclusive_method' for #<Object:0xa17b77c>>

上面的例子可以使用 define_singleton_method 編寫 :

object.define_singleton_method :exclusive_method do
  "The method is actually defined in the object's singleton class"
end

這與定義 objectsingleton_class 上的方法相同 :

# send is used because define_method is private
object.singleton_class.send :define_method, :exclusive_method do
  "Now we're defining an instance method directly on the singleton class"
end

singleton_class 作為 Ruby 的核心 API 的一部分存在之前,單例類被稱為元類,可以通過以下習語訪問:

class << object
  self  # refers to object's singleton_class
end