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"