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