Die Programmiersprache Ruby (German Edition)
dann)
0
zurückgibt, wenn
== true
zurückgibt.
3.8.7 Objektkonvertierung
Viele Ruby-Klassen definieren Methoden, die eine Darstellung des Objekts als Wert einer anderen Klasse zurückliefern. Die Methode
to_s
zur Ermittlung einer String-Darstellung eines Objekts ist wahrscheinlich die bekannteste und am häufigsten implementierte dieser Methoden. Die nachfolgenden Unterabschnitte beschreiben verschiedene Kategorien der Konvertierung.
3.8.7.1 Explizite Konvertierung
Klassen definieren explizite Konvertierungsmethoden zur Verwendung durch Anwendungscode, der einen Wert in eine andere Darstellung konvertieren muss. Die gängigsten Methoden dieser Kategorie sind
to_s
,
to_i
,
to_f
und
to_a
zur Konvertierung in
String
,
Integer
,
Float
beziehungsweise
Array
.
Eingebaute Methoden rufen diese Methoden normalerweise nicht für Sie auf. Wenn Sie eine Methode aufrufen, die einen
String
erwartet, und ein Objekt anderer Art übergeben, wird nicht erwartet, dass diese Methode das Argument mit
to_s
konvertiert. (Werte, die in Strings mit doppelten Anführungszeichen interpoliert werden, werden allerdings automatisch mit
to_s
konvertiert.)
to_s
ist ganz klar die wichtigste der Konvertierungsmethoden, da String-Darstellungen von Objekten so häufig in Benutzeroberflächen eingesetzt werden. Eine wichtige Alternative zu
to_s
ist die Methode
inspect
.
to_s
hat im Allgemeinen den Zweck, eine für Menschen lesbare Darstellung des Objekts zurückzugeben, die für Endbenutzer gedacht ist.
inspect
ist dagegen für den Debugging-Gebrauch gedacht und sollte eine Darstellung zurückgeben, die hilfreich für Ruby-Entwickler ist. Die von
Object
vererbte
inspect
-Methode ruft einfach
to_s
auf.
3.8.7.2 Implizite Konvertierung
Manchmal weist eine Klasse deutliche Charakterzüge einer anderen Klasse auf. Die Ruby-Klasse
Exception
stellt einen Fehler oder einen unerwarteten Zustand in einem Programm dar und kapselt eine Fehlermeldung. In Ruby 1.8 sind
Exception
-Objekte nicht einfach in Strings konvertierbar; sie sind String-artige Objekte und können in vielen Kontexten so behandelt werden, als seien sie Strings. [ 11 ] Zum Beispiel:
# Nur Ruby 1.8
e = Exception.new("keine echte Ausnahme")
msg = "Fehler: " + e # String-Verkettung mit einer Exception
Da
Exception
-Objekte String-artig sind, können sie mit dem String-Verkettungsoperator verwendet werden. Mit den meisten anderen Ruby-Klassen funktioniert das nicht. Der Grund dafür, dass
Exception
-Objekte sich wie
String
-Objekte verhalten können, ist, dass
Exception
in Ruby 1.8 die implizite Konvertierungsmethode
to_str
implementiert und dass der von
String
definierte Operator
+
diese Methode für seinen rechten Operanden aufruft.
Weitere implizite Konvertierungsmethoden sind
to_int
für Objekte, die Integer-artig sein sollen,
to_ary
für Objekte, die Array-artig sein sollen, und
to_hash
für Objekte, die Hash-artig sein sollen. Unglücklicherweise sind die Umstände, unter denen diese impliziten Konvertierungsmethoden aufgerufen werden, nicht gut dokumentiert. Unter den eingebauten Klassen sind diese impliziten Konvertierungsmethoden auch nicht allgemein implementiert.
Weiter oben haben wir nebenbei angemerkt, dass der Operator
==
beim Test auf Gleichheit eine Art schwacher Typkonvertierung durchführen kann. Die von
String
,
Array
und
Hash
definierten
==
-Operatoren überprüfen, ob der rechte Operand derselben Klasse angehört wie der linke. Falls das zutrifft, vergleichen sie sie. Falls nicht, überprüfen sie, ob der rechte Operand eine
to_str
-,
to_ary
- oder
to_hash
-Methode besitzt. Sie rufen diese Methode nicht auf, aber falls sie existiert, rufen sie die Methode
==
des rechten Operanden auf und überlassen ihm die Entscheidung, ob er mit dem linken Operanden identisch ist.
In Ruby 1.9 definieren die eingebauten Klassen
String
,
Array
,
Hash
,
Regexp
und
IO
alle eine Klassenmethode namens
try_convert
. Diese Methoden konvertieren ihr Argument, wenn es eine entsprechende implizite Konvertierungsmethode definiert, und andernfalls
nil
.
Array.try_convert(o)
gibt
o.to_ary
zurück, wenn
o
diese Methode definiert, und andernfalls
nil
. Diese
try_convert
-Methoden sind bequem, wenn Sie Methoden schreiben möchten, die die implizite Konvertierung ihrer Argumente erlauben.
3.8.7.3 Konvertierungsfunktionen
Das Modul
Kernel
definiert vier Konvertierungsmethoden, die als globale Konvertierungsfunktionen fungieren können. Diese Funktionen –
Array
,
Float
,
Integer
und
String
– haben
Weitere Kostenlose Bücher