单例类

所有对象都是类的实例。然而,这不是全部真相。在 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