Die Programmiersprache Ruby (German Edition)
etwa
length
,
size
, die Vergleichsoperatoren und sogar die Operatoren
[]
und
=~
. Dies macht Symbole und Strings bis zu einem gewissen Grad untereinander austauschbar und ermöglicht den Einsatz von Symbolen als eine Art unveränderlicher Strings (ohne Garbage-Collection).
3.7 True, False und Nil
In „2.1.5 Schlüsselwörter“ haben wir gesehen, dass
true
,
false
und
nil
in Ruby Schlüsselwörter sind.
true
und
false
sind die beiden Boolean-Werte; sie repräsentieren die Werte wahr und falsch, ja und nein, an und aus.
nil
ist ein spezieller Wert, der die Abwesenheit eines Wertes anzeigt.
Jedes dieser Schlüsselwörter ergibt ein spezielles Objekt.
true
ergibt ein Objekt, das die Singleton-Instanz der Klasse
TrueClass
ist. Entsprechend sind
false
und
nil
Singleton-Instanzen von
FalseClass
beziehungsweise
NilClass
. Beachten Sie, dass es in Ruby keine
Boolean
-Klasse gibt. Sowohl
TrueClass
als auch
FalseClass
haben
Object
als Elternklasse.
Wenn Sie prüfen möchten, ob ein Wert
nil
ist, können Sie ihn einfach mit
nil
vergleichen oder die Methode
nil?
verwenden:
o == nil # Ist o nil?
o.nil? # Eine andere Prüfungsmöglichkeit
Beachten Sie, dass
true
,
false
und
nil
auf Objekte und nicht auf Zahlen verweisen.
false
und
nil
sind nicht dasselbe wie
0
, und
true
ist nicht dasselbe wie
1
. Wenn Ruby einen Boolean-Wert benötigt, verhält sich
nil
wie
false
, und jeder andere Wert als
nil
oder
false
verhält sich wie
true
.
3.8 Objekte
Ruby ist eine sehr konsequent objektorientierte Programmiersprache: Alle Werte sind Objekte, und es gibt keinen Unterschied zwischen primitiven Typen und Objekttypen wie in vielen anderen Sprachen. In Ruby werden alle Objekte von einer Klasse namens
Object
abgeleitet und haben die durch diese Klasse definierten Methoden gemeinsam. Dieser Abschnitt erläutert die gemeinsamen Features aller Objekte in Ruby. Er ist teilweise recht kompakt, aber es ist nötig, ihn zu lesen; die enthaltenen Informationen sind fundamental.
3.8.1 Objektreferenzen
Wenn wir in Ruby mit Objekten arbeiten, arbeiten wir in Wirklichkeit mit Objektreferenzen . Es ist nicht das Objekt selbst, das wir manipulieren, sondern eine Referenz darauf. [ 10 ] Wenn wir einer Variablen einen Wert zuweisen, kopieren wir kein Objekt »in« diese Variable hinein, sondern speichern eine Referenz auf ein Objekt in dieser Variablen. Etwas Code macht das deutlicher:
s = "Ruby" # String-Objekt erzeugen. Eine Referenz darauf in s speichern
t = s # Referenz nach t kopieren. s und t beziehen sich auf dasselbe Objekt
t[-1] = "" # Das Objekt durch die Referenz in t modifizieren
print s # Durch s auf das Objekt zugreifen. Gibt "Rub" aus
t = "Java" # t bezieht sich nun auf ein anderes Objekt
print s,t # Gibt "RubJava" aus
Wenn Sie einer Methode in Ruby ein Objekt übergeben, wird eine Objektreferenz an die Methode übergeben. Es ist nicht das Objekt selbst, aber auch keine Referenz auf die Objektreferenz. Anders formuliert: Methodenargumente werden als Werte ( call by value ) übergeben und nicht als Referenzen ( call by reference ), aber die Werte werden als Objektreferenzen übergeben.
Da Objektreferenzen an Methoden übergeben werden, können Methoden diese Referenzen verwenden, um das zugrunde liegende Objekt zu modifizieren. Diese Änderungen sind dann sichtbar, wenn die Methode zurückkehrt.
3.8.1.1 Unmittelbare Werte
Wir haben gesagt, dass alle Werte in Ruby Objekte sind und dass alle Objekte als Referenzen manipuliert werden. In der Referenzimplementierung sind
Fixnum
- und
Symbol
-Objekte allerdings in Wirklichkeit »unmittelbare Werte« und keine Referenzen. Keine dieser beiden Klassen hat Mutator-Methoden, so dass
Fixnum
- und
Symbol
-Objekte unveränderlich sind, was bedeutet, dass es keine Möglichkeit gibt, festzustellen, dass sie als Werte statt als Referenzen manipuliert werden.
Die Existenz unmittelbarer Werte sollte als Implementierungsdetail betrachtet werden. Der einzige praktische Unterschied zwischen unmittelbaren Werten und Referenzwerten besteht darin, dass für unmittelbare Werte keine Singleton-Methoden definiert werden können. (Singleton-Methoden werden in „6.1.4 Singleton-Methoden definieren“ erläutert.)
3.8.2 Objektlebenszyklus
Die bisher in diesem Kapitel beschriebenen, eingebauten Ruby-Klassen besitzen eine Literal-Syntax, und Instanzen dieser Klassen werden einfach erzeugt, indem man ihre Werte als Literale in den Code einfügt. Objekte anderer Klassen müssen explizit erzeugt werden, und das
Weitere Kostenlose Bücher