next up previous contents index
Search 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}



Footnotes

... mehr[*]
class << obj = Neue Klasse nur für Objekt obj


(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20