next up previous contents index
Next: Ändern von Klassen Up: Besonderheiten bei def Previous: Sichtbarkeitsbegrenzer   Contents   Index

Objekte und Singleton-Methoden

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


\epsfig{height=36pt,file=images/chan.eps}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"]
\epsfig{height=10pt,file=images/ruby.eps}

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


\epsfig{height=36pt,file=images/chan.eps}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
\epsfig{height=10pt,file=images/ruby.eps}



Armin Roehrl, Stefan Schmiedl und Clemens Wyss 2002-01-16