Man kann in Ruby auch Methoden definieren, die nur für ein ganz bestimmtes Objekt (Singleton) gelten. Solche Methoden werden Singleton-Methoden genannt.
class Ding; def to_s; "ding"; end; end a = Ding.new b = a.clone def a.to_s; "a"; end a #-> a b #-> ding #Kontrolle a.singleton_methods #-> ["to_s"] b.singleton_methods #-> []
Wird allerdings die Reihenfolge vertauscht, ändert sich das Ergebnis:
class Ding; def to_s; "ding"; end; end a = Ding.new def a.to_s; "a"; end b = a.clone a #-> a b #-> a #Kontrolle a.singleton_methods #-> ["to_s"] b.singleton_methods #-> ["to_s"]
Nachdem Klassen auch nur Objekte sind, müssten
Klassenmethoden eigentlich Singleton-Methoden der Klassenobjekte sein.
In der Tat:
class Ding; def Ding.xxx; end; end Ding.singleton_methods ["xxx"]
Sollte man mehr
als eine Singleton-Methode für ein Objekt
definieren wollen, kann man in Anlehnung an die Vererbung
bei Klassen Folgendes schreiben:
s="Ruby" class <<s def to_i; 4; end def to_f; 4.0; end end s.to_i #-> 4 s.to_f #-> 4.0
Vor allem in kleinen Skripten definiert man Methoden außerhalb einer Klasse.
Diese Methoden werden private Methoden der Klasse Object und mit dem
so genannten Toplevel-Objekt main als impliziten Empfänger aufgerufen,
wie das folgende Beispiel zeigt:
def ungebunden; self; end id #-> 538233304 self.id #-> 538233304 self #-> main self.class #-> Object Object.private_methods #-> [ungebunden, ...] ungebunden #-> main