Ruby Language Classes Singleton


Exemple

Tous les objets sont des instances d'une classe. Cependant, ce n'est pas toute la vérité. Dans Ruby, chaque objet a également une classe singleton quelque peu cachée.

C'est ce qui permet de définir des méthodes sur des objets individuels. La classe singleton se situe entre l'objet lui-même et sa classe réelle, de sorte que toutes les méthodes définies sur cet objet sont disponibles pour cet objet, et cet objet uniquement.

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>>

L'exemple ci-dessus aurait pu être écrit en utilisant define_singleton_method :

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

Ce qui revient à définir la méthode sur singleton_class object :

# 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

Avant l'existence de singleton_class dans le cadre de l'API principale de Ruby, les classes singleton étaient connues sous le nom de métaclasses et pouvaient être accédées via l'idiome suivant:

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