Eine Singleton-Klasse ist im einfachsten Sinne eine spezielle Klasse, die Ruby-Host-Methoden für einzelne Objekte erstellt. In Ruby ist es möglich, Methoden für einzelne Objekte zu definieren, die nur für dieses Objekt eindeutig sind. Betrachten Sie zum Beispiel das Folgende unten
class User; end
user = User.new
def user.age
"i'm a unique method"
end
user1 = User.new
user.age #"i'm a unique method"
user1.age # NoMethodError (undefined method `age' for #<User:0x0000559c66ab7338>)
Wie Sie oben sehen können, reagiert das Objekt user1 nicht auf die Methode 'age', da es sich um eine Singleton-Methode handelt, eine Methode, die für das Benutzerobjekt eindeutig definiert ist. Zu diesem Zweck erstellt Ruby eine spezielle Klasse, die als Singleton-Klasse oder Eigenklasse bezeichnet wird, um diese einzigartige Methode zu hosten. Sie können dies überprüfen, indem Sie folgende Schritte ausführen:
user.singleton_class # #<Class:#<User:0x0000559c66b47c58>>
Sie können Ruby auch fragen, ob die Methode 'age' hier gefunden wird, indem Sie mithilfe des Methodenobjekts herausfinden, wo die Methode 'age' definiert ist. Wenn Sie dies tun, werden Sie sehen, dass die Singleton-Klasse diese Methode hat.
user_singleton_class = user.method(:age).owner # #<Class:#<User:0x0000559c66b47c58>>
user.method(:age).owner == user.singleton_class # true
user_singleton_class.instance_methods(false) # [:age]
Beachten Sie auch, dass Singleton-Methoden für eine Singleton-Klasse tatsächlich Instanzmethoden sind.
user.singleton_methods == user_singleton_class.instance_methods(false) # true