Dass in Ruby alles ein Objekt ist, ist ja relativ bekannt. Dass in Ruby jedoch jedes Objekt auch ein individuelles Objekt ist, gehört vermutlich nicht zum allgemeinen Wissen über Ruby. Aber gerade dieses Konzept der Individualität von Objekten macht Ruby noch ein gutes Stück natürlicher; denn schließlich hat auch nicht jeder Mensch die gleichen Talente. Diese individuellen Fähigkeiten von Objekten werden in Ruby mithilfe sogenannter Singleton- oder Eigenklassen dargestellt (der erste Begriff ist dabei der gängigere, daneben wurde vor allem von _why der Begriff »Metaklasse« benutzt) und fast jedes Objekt in Ruby besitzt eine solche. Ausnahmen sind nur Immediate Values wie Fixnums oder Symbole. Das Konzept ist ganz einfach vorgestellt:
Wie wir sehen, können wir also Singletonmethoden definieren, indem wir das Objekt, dass diese Methode »erlernen« soll, angeben: def object.method. SingletonklassenNun ist ja die ganze Zeit von Singletonklassen die Rede, aber bis hierhin haben wir nur Singletonmethoden kennen gelernt. Methoden werden bekanntlicherweise ja immer in Klassen (oder Modulen) definiert. Wo ist also die Klasse, die die Methode baz aus dem obigen Beispiel beinhaltet? Zum Öffnen der Singletonklasse eines Objektes bietet Ruby eine spezielle Syntax. Wir hätten baz auch so definieren können:
class << object öffnet die Singletonklasse eines Objektes. Dies ist eine der wenigen Stellen in Ruby, in denen statt Syntax keine Methode angewandt werden kann. Es gibt kein Object#singleton_class wie es ein Object#class gibt. Das Problem lässt sich jedoch leicht kompensieren:
_why hat diese Technik zum Erstellen eines meta_evals benutzt, um ein eval im Kontext der Singletonklasse eines Objektes auszuführen (vgl. auch intstance_eval). KlassenmethodenVielleicht ist es ja dem ein oder anderen schon im obersten Abschnitt beim Definieren von baz für x aufgefallen: Die Syntax ähnelt doch sehr der für Klassenmethoden. Tja, sie ähnelt der Syntax nicht nur, es ist exakt die selbe. Denn Klassenmethoden sind nichts anderes als Singletonmethoden auf dem Objekt der Klasse.
Ist das gleiche wie:
Der BegriffAls letztes noch die Frage: »Warum heißt das denn Singleton?«
Weil sie eben nur einmal instanziiert werden kann und deshalb single, also einmalig, ist. |
||||||||||||||||||||||||