Die Programmiersprache Ruby (German Edition)
dieselben Namen wie die Klassen, in die sie Werte konvertieren, und das Ungewöhnliche an ihnen ist, dass sie mit einem Großbuchstaben beginnen.
Die Funktion
Array
versucht, ihr Argument in ein Array umzuwandeln, indem sie
to_ary
aufruft. Falls diese Methode nicht definiert ist oder
nil
zurückliefert, probiert sie es mit der Methode
to_a
. Ist auch
to_a
nicht definiert oder gibt
nil
zurück, liefert die Funktion
Array
einfach ein neues Array, das das Argument als einziges Element enthält.
Die Funktion
Float
konvertiert
Numeric
-Argumente direkt in
Float
-Objekte. Für alle Nicht-
Numeric
-Werte wird dagegen die Methode
to_f
aufgerufen.
Die Funktion
Integer
konvertiert ihr Argument in eine
Fixnum
oder
Bignum
. Wenn das Argument ein
Numeric
-Wert ist, wird es direkt konvertiert. Fließkommawerte werden abgeschnitten statt gerundet. Wenn das Argument ein String ist, wird ein Basisindikator gesucht (eine führende
0
für oktal,
0x
für hexadezimal oder
0b
für binär), und der String wird entsprechend konvertiert. Anders als bei
String.to_i
sind keine nichtnumerischen Folgezeichen erlaubt. Bei jeder anderen Art von Argument probiert die Funktion
Integer
die Konvertierung zunächst mit
to_int
und dann mit
to_i
.
Die Funktion
String
schließlich konvertiert ihr Argument in einen String, indem sie einfach seine
to_s
-Methode aufruft.
3.8.7.4 Typ-Erzwingung für arithmetische Operatoren
Numerische Typen definieren eine Konvertierungsmethode namens
coerce
. Der Zweck dieser Methode besteht darin, das Argument in denselben Typ zu konvertieren wie das numerische Objekt, für das die Methode aufgerufen wird, oder beide Objekte in einen allgemeineren, kompatiblen Typ zu konvertieren. Die Methode
coerce
liefert stets ein Array zurück, das zwei numerische Werte desselben Typs enthält. Das erste Element des Arrays ist der konvertierte Wert des
coerce
-Arguments. Das zweite Element des zurückgegebenen Arrays ist der (nötigenfalls konvertierte) Wert, für den
coerce
aufgerufen wurde:
1.1.coerce(1) # [1.0, 1.1]: coerce von Fixnum zu Float
require "rational" # Rationale Zahlen verwenden
r = Rational(1,3) # Ein Drittel als rationale Zahl
r.coerce(2) # [Rational(2,1), Rational(1,3)]: Fixnum in Rational konvertiert
Die Methode
coerce
wird von arithmetischen Operatoren eingesetzt. Der von
Fixnum
definierte Operator
+
weiß beispielsweise nichts über
Rational
-Zahlen, und wenn sein rechter Operand ein
Rational
-Wert ist, weiß er nicht, wie er diesen addieren soll.
coerce
liefert die Lösung. Numerische Operatoren sind so geschrieben, dass sie die Methode
coerce
des rechten Operanden aufrufen und den linken Operanden als Argument übergeben, wenn sie den Typ des rechten Operanden nicht kennen. Was unser Beispiel, das Addieren einer
Fixnum
und eines
Rational
-Wertes, angeht, liefert die Methode
coerce
von
Rational
ein Array von zwei
Rational
-Werten zurück. Nun kann der von
Fixnum
definierte
+
-Operator einfach
+
für die Werte im Array aufrufen.
3.8.3.5 Boolean-Typkonvertierung
Boolean-Werte verdienen im Kontext der Typkonvertierung eine spezielle Betrachtung. Ruby ist sehr streng, was seine Boolean-Werte angeht:
true
und
false
haben
to_s
-Methoden, die »true« beziehungsweise »false« zurückgeben, aber sie definieren keine anderen Konvertierungsmethoden. Und es gibt keine
to_b
-Methode, die andere Werte in Booleans umwandelt.
In manchen Sprachen ist
false
dasselbe wie
0
, oder es kann in
0
und wieder zurück konvertiert werden. In Ruby sind die Werte
true
und
false
eigenständige, unterschiedliche Objekte, und es gibt keine impliziten Konvertierungen, die andere Werte in
true
oder
false
konvertieren. Das ist allerdings nur die halbe Wahrheit. Rubys Boolean-Operatoren sowie die Fallentscheidungs- und Schleifenkonstrukte, die Boolean-Ausdrücke verwenden, können mit anderen Werten als
true
und
false
arbeiten. Die Regel ist einfach: In Boolean-Ausdrücken verhält sich jeder Wert außer
false
oder
nil
wie
true
(aber wird nicht in
true
konvertiert).
nil
dagegen verhält sich wie
false
.
Angenommen, Sie wollen überprüfen, ob die Variable
x nil
ist oder nicht. In manchen Sprachen müssen Sie explizit einen Vergleichsausdruck schreiben, der
true
oder
false
ergibt:
if x != nil # Ausdruck "x != nil" gibt true oder false für if zurück
puts x # x ausgeben, wenn es definiert ist
end
Dieser Code funktioniert in Ruby, aber es kommt häufiger vor, dass man sich einfach die Tatsache zunutze macht, dass sich alle Werte
Weitere Kostenlose Bücher