Die Programmiersprache Ruby (German Edition)
geschieht am häufigsten mithilfe einer Methode namens
new
:
myObject = myClass.new
new
ist eine Methode der Klasse
Class
. Sie reserviert Speicher, um das neue Objekt abzulegen, und initialisiert dann den Zustand des neu erzeugten »leeren« Objekts durch Aufruf seiner
initialize
-Methode. Die Argumente von
new
werden direkt an
initialize
weitergereicht. Die meisten Klassen definieren eine
initialize
-Methode, um alle notwendigen Initialisierungsschritte für die neue Instanz durchzuführen.
Die Methoden
new
und
initialize
stellen das Standardverfahren zur Erzeugung neuer Klassen dar, aber Klassen können auch andere Methoden definieren, die Instanzen zurückgeben und als »Factory-Methoden« bekannt sind. Mehr über
new
,
initialize
und Factory-Methoden erfahren Sie in „7.4 Erzeugen und Initialisieren von Objekten“ .
Ruby-Objekte brauchen niemals explizit dealloziert zu werden, was in Sprachen wie C und C++ der Fall ist. Ruby verwendet ein Verfahren namens Garbage Collection , um nicht mehr benötigte Objekte automatisch zu zerstören. Ein Objekt wird zum Kandidaten für die Garbage Collection, wenn es unerreichbar ist – wenn es also keine Referenzen mehr auf das Objekt gibt, außer von anderen unerrreichbaren Objekten aus.
Die Tatsache, dass Ruby Garbage Collection einsetzt, bedeutet, dass Ruby-Programme weniger stark von Speicherlecks betroffen sind als Programme, die in Sprachen geschrieben sind, in denen Objekte explizit dealloziert und bereinigt werden müssen. Aber Garbage Collection bedeutet nicht, dass Speicherlecks unmöglich wären: Jeder Code, der langlebige Referenzen auf Objekte erzeugt, die ansonsten kurzlebig wären, kann ein Grund für Speicherlecks sein. Betrachten Sie etwa einen Hash, der als Cache genutzt wird. Wird der Cache nicht mithilfe einer Art »Lange-nicht-genutzt«-Algorithmus bereinigt, dann bleiben Objekte im Cache erreichbar, solange der Hash selbst erreichbar ist. Wenn der Hash über eine globale Variable referenziert wird, dann bleibt er erreichbar, solange der Ruby-Interpreter läuft.
3.8.3 Objektidentität
Jedes Objekt hat einen Objekt-Identifier, eine
Fixnum
, die Sie mithilfe der Methode
object_id
ermitteln können. Der zurückgegebene Wert ist für die Lebensdauer des Objekts konstant und eindeutig. Solange auf das Objekt zugegriffen weden kann, behält es immer dieselbe ID, und kein anderes Objekt teilt sich diese ID mit ihm.
Die Methode
id
ist ein veraltetes Synonym für
object_id
. Ruby 1.8 gibt eine Warnung aus, wenn Sie es benutzen, und in Ruby 1.9 wurde es entfernt.
__id__
dagegen ist ein gültiges Synonym für
object_id
. Diese Methode existiert zur Absicherung, nämlich damit Sie auch dann noch auf die ID eines Objekts zurückgreifen können, wenn die Methode
object_id
gelöscht oder überschrieben wurde.
Die Klasse
Object
implementiert die Methode
hash
einfach so, dass sie die ID eines Objekts zurückliefert.
3.8.4 Objektklasse und Objekttyp
Es gibt verschiedene Möglichkeiten, die Klasse eines Objekts in Ruby zu ermitteln. Die einfachste Möglichkeit besteht darin, danach zu fragen:
o = "test" # Dies ist ein Wert
o.class # Gibt ein Objekt zurück, das die Klasse String repräsentiert
Wenn Sie sich für die Klassenhierarchie eines Objekts interessieren, können Sie jede Klasse fragen, was ihre Oberklasse ist:
o.class # String: o ist ein String-Objekt
o.class.superclass # Object: Oberklasse von String ist Object
o.class.superclass.superclass # nil: Object hat keine Oberklasse
In Ruby 1.9 ist
Object
nicht mehr die eigentliche Wurzel der Klassenhierarchie:
# Nur Ruby 1.9
Object.superclass # BasicObject: Object hat in 1.9 eine Oberklasse
BasicObject.superclass # nil: BasicObject hat keine Oberklasse
Mehr über
BasicObject
erfahren Sie in „7.3 Subklassen und Vererbung“ .
Eine besonders einfache Möglichkeit, die Klasse eines Objekts zu überprüfen, ist also der direkte Vergleich:
o.class == String # true, wenn o ein String ist
Die Methode
instance_of?
erledigt dieselbe Aufgabe ein wenig eleganter:
o.instance_of? String # true, wenn o ein String ist
Wenn wir die Klasse eines Objekts prüfen, möchten wir üblicherweise auch wissen, ob das Objekt eine Instanz irgendeiner Unterklasse dieser Klasse ist. Verwenden Sie dazu die Methode
is_a?
oder ihr Synonym
kind_of?
:
x = 1 # Dies ist der Wert, mit dem wir arbeiten
x.instance_of? Fixnum # true: Ist eine Instanz von Fixnum
x.instance_of? Numeric # false: instance_of? prüft keine Vererbung
x.is_a?
Weitere Kostenlose Bücher