Eine Singleton-Klasse ist, vereinfacht ausgedrückt, eine spezielle Klasse, die Ruby erstellt, um Methoden zu beherbergen, die für einzelne Objekte definiert sind. In Ruby ist es möglich, Methoden für einzelne Objekte zu definieren, die nur für dieses eine Objekt gelten. Betrachten Sie zum Beispiel das folgende Beispiel
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 nur für das Objekt user definiert ist. Damit dies geschehen kann, erstellt Ruby eine spezielle Klasse, die Singleton-Klasse oder Eigenklasse genannt wird, um diese einzigartige Methode zu beherbergen. Sie können dies wie folgt überprüfen:
user.singleton_class # #<Class:#<User:0x0000559c66b47c58>>
Sie können Ruby auch fragen, ob die Methode "age" hier zu finden ist, indem Sie das Methodenobjekt verwenden, um herauszufinden, 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, soweit es sich um eine Singleton-Klasse handelt, eigentlich ihre Instanzmethoden sind.
user.singleton_methods == user_singleton_class.instance_methods(false) # true