Operatoren
In Ruby werden Operatoren wie + als Methoden auf der Klasse definiert. Literale definieren ihre Methoden auf einer tieferen Ebene, in der C-Sprache. Zum Beispiel die String-Klasse.
Ruby-Objekte können ihre eigene Implementierung für die meisten Operatoren definieren oder überladen.
Hier ist ein Beispiel
class Foo < String def +(str) self.concat(str).concat("another string") end end foobar = Foo.new("test ") puts foobar + "baz "
Dies gibt aus:
test baz another string
Welche Operatoren verfügbar sind, hängt von der implementierenden Klasse ab.
Operatorverhalten
Wie sich eine Klasse gegenüber einem bestimmten Operator verhält, ist spezifisch für diese Klasse, da Operatoren Methodenimplementierungen sind.
Wenn ein Operator verwendet wird, gibt der Ausdruck auf der linken Seite der Operation das Verhalten an.
'a' * 3 #=> "aaa" 3 * 'a' # TypeError: String can't be coerced into Integer
Logische Operatoren
Logische Operatoren sind keine Methoden und können daher nicht neu definiert/überladen werden. Sie werden auf einer niedrigeren Ebene tokenisiert.
Kurzschluss-logische Operatoren (&&, ||, and und or) führen nicht immer zu einem booleschen Wert. Ähnlich wie bei Blöcken ist der zuletzt ausgewertete Ausdruck das Ergebnis der Operation.
&&, and
Sowohl die Operatoren && als auch and bieten Kurzschlussfunktionalität, indem sie jede Seite des Operators von links nach rechts ausführen und beim ersten Vorkommen eines falsch bewerteten Ausdrucks stoppen. Der Ausdruck, der das Ergebnis definiert, ist der zuletzt ausgeführte, sei es der endgültige Ausdruck oder das erste Vorkommen eines falsch bewerteten Ausdrucks.
Einige Beispiele
true && 9 && "string" #=> "string" (1 + 2) && nil && "string" #=> nil (a = 1) && (b = false) && (c = "string") #=> false puts a #=> 1 puts b #=> false puts c #=> nil
Im letzten Beispiel wurde c initialisiert, aber nicht definiert.
||, or
Die Art und Weise, wie ||/or einen Kurzschluss bewirken, ist, das Ergebnis des ersten Ausdrucks zurückzugeben, der als wahr bewertet wird.
Einige Beispiele
(1 + 2) || true || "string" #=> 3 false || nil || "string" #=> "string"