Die Programmiersprache Ruby (German Edition)
Flip-Flop-Funktion können wir folgenden Code schreiben, der
345
ausgibt, genau wie unser voriges Beispiel:
(1..10).each {|x| print x if flipflop(x) }
Die folgende Funktion simuliert das Verhalten des Drei-Punkte-Flip-Flops
x==3...x>=3
:
$state2 = false
def flipflop2(x)
if !$state2
$state2 = (x == 3)
else
$state2 = !(x >= 3)
true
end
end
# Jetzt ausprobieren
(1..10).each {|x| print x if x==3...x>=3 } # Gibt "34" aus
(1..10).each {|x| print x if flipflop2(x) } # Gibt "34" aus
4.6.10 Bedingungsprüfung: ?:
Der Operator
?:
ist als Fallentscheidungs- oder Bedingungsoperator (englisch conditional operator ) bekannt. Es ist der einzige ternäre Operator (drei Operanden) in Ruby. Der erste Operand steht vor dem Fragezeichen. Der zweite Operand steht zwischen dem Fragezeichen und dem Doppelpunkt. Und der dritte Operand steht hinter dem Doppelpunkt.
Der Operator
?:
wertet immer seinen ersten Operanden aus. Wenn der erste Operand irgendetwas anderes als
false
oder
nil
ist, ist der Wert des Ausdrucks der Wert des zweiten Operanden. Andernfalls, wenn also der erste Operand
false
oder
nil
ist, ist der Wert des Ausdrucks der Wert des dritten Operanden. In jedem Fall wird einer der Operanden niemals ausgewertet (was eine Rolle spielt, wenn Nebenwirkungen wie etwa Wertzuweisungen ins Spiel kommen). Hier ein Anwendungsbeispiel dieses Operators:
"Sie haben #{n} #{n==1 ? 'Nachricht' : 'Nachrichten'}"
Wie Sie sehen, fungiert der Operator
?:
als eine Art kompakte
if/then/else
-Anweisung. (Rubys
if
-Fallentscheidung wird in Kapitel 5 beschrieben.) Der erste Operand ist die Bedingung, die geprüft wird, wie der Ausdruck hinter dem
if
. Der zweite Operand entspricht dem Code, der auf das
then
folgt. Und der dritte Operand entspricht dem Code, der auf das
else
folgt. Der Unterschied zwischen dem Operator
?:
und der if-Anweisung ist natürlich der, dass die if-Anweisung in ihrer then- beziehungsweise else-Klausel beliebige Codemengen zulässt, während der Operator
?:
nur einzelne Ausdrücke erlaubt.
Der Operator
?:
hat einen ziemlich niedrigen Rang, was bedeutet, dass es normalerweise nicht notwendig ist, Klammern um die Operanden zu setzen. Wenn der erste Operand den Operator
defined?
verwendet oder wenn der zweite und dritte Operand Wertzuweisungen durchführen, sind Klammern notwendig. Denken Sie daran, dass Ruby grundsätzlich Methodennamen erlaubt, die mit einem Fragezeichen enden. Wenn der erste Operand des
?:
-Operators mit einem Bezeichner endet, müssen Sie Klammern um den ersten Operanden oder aber ein Leerzeichen zwischen diesen Operanden und das Fragezeichen setzen, um die Zweideutigkeit zu entfernen. Wenn Sie das nicht tun, denkt der Ruby-Interpreter, dass das Fragezeichen des Operators ein Teil des vorherigen Bezeichners sei, zum Beispiel:
x==3?y:z # Dies ist erlaubt.
3==x?y:z # Syntaxfehler: x? wird als Methodenname interpretiert.
(3==x)?y:z # Okay: Klammern lösen das Problem.
3==x ?y:z # Auch Leerzeichen lösen das Problem.
Das Fragezeichen muss in derselben Zeile stehen wie das erste Argument. In Ruby 1.8 muss der Doppelpunkt in derselben Zeile stehen wie das zweite Argument. In Ruby 1.9 ist dagegen ein Zeilenumbruch vor dem Doppelpunkt erlaubt. In diesem Fall müssen Sie hinter den Doppelpunkt allerdings ein Leerzeichen setzen, so dass er kein Symbolliteral einzuleiten scheint.
Tabelle 4.2 (weiter oben in diesem Kapitel) besagt, dass der Operator
?:
rechtsassoziativ ist. Wenn der Operator zweimal im selben Ausdruck verwendet wird, wird der rechte gruppiert:
a ? b : c ? d : e # Dieser Ausdruck ...
a ? b : (c ? d : e) # ... wird wie dieser ausgewertet ...
(a ? b : c) ? d : e # ... NICHT wie dieser
Diese Art der Doppeldeutigkeit kommt beim
?:
-Operator eigentlich recht selten vor. Der folgende Ausdruck verwendet drei Fallentscheidungsoperatoren, um den Höchstwert aus drei Variablen zu ermitteln. Es werden keine Klammern benötigt (aber Leerzeichen vor den Fragezeichen), da es nur eine mögliche Art gibt, den Ausdruck zu parsen:
max = x>y ? x>z ? x : z : y>z ? y : z
max = x>y ? (x>z ? x : z) : (y>z ? y : z) # Mit expliziten Klammern
4.6.11 Wertzuweisungsoperatoren
Sie haben bereits in „4.5 Wertzuweisung“ das Wichtigste über Wertzuweisungsausdrücke gelesen. An dieser Stelle sollen einige Hinweise über die in diesen Ausdrücken verwendeten Wertzuweisungsoperatoren gegeben werden. Erstens ist der Wert eines Zuweisungsausdrucks der Wert (oder ein Array von Werten), der auf der rechten Seite des
Weitere Kostenlose Bücher