單例類
所有物件都是類的例項。然而,這不是全部真相。在 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