Die Programmiersprache Ruby (German Edition)
Wenn
x
keine Methode namens
invert
besitzt, dann geschieht gar nichts, und der Wert von
y
wird nicht modifiziert. In der zweiten Zeile bezieht der Modifier sich nur auf den Methodenaufruf. Wenn
x
keine
invert
-Methode hat, ergibt der modifizierte Ausdruck
nil
, und dies ist der Wert, der
y
zugewiesen wird.
Ein
if
-Modifier ist mit dem nächstgelegenen einzelnen Ausdruck verbunden. Wenn Sie mehr als einen Ausdruck modifizieren möchten, können Sie Klammern oder eine
begin
-Anweisung zur Gruppierung verwenden. Aber dieser Ansatz ist problematisch, weil Leser nicht wissen, dass der Code Teil einer Fallentscheidung ist, bis sie sein Ende erreichen. Außerdem weist ein derart verwendeter
if
-Modifier nicht mehr die Kürze auf, die der Hauptnutzen dieser Syntax ist. Wenn mehr als eine Codezeile betroffen ist, sollten Sie üblicherweise eine traditionelle
if
-Anweisung statt eines
if
-Modifiers verwenden. Vergleichen Sie die drei folgenden Möglichkeiten:
if Ausdruck begin (
Zeile1 Zeile1 Zeile1
Zeile2 Zeile2 Zeile2
end end if Ausdruck ) if Ausdruck
Beachten Sie, dass ein durch eine
if
-Klausel modifizierter Ausdruck selbst wieder ein Ausdruck ist, der modifiziert werden kann. Es ist daher möglich, mehrere
if
-Modifier an einen Ausdruck anzuhängen:
# message ausgeben, falls existent und falls die Methode output definiert ist
puts message if message if defined? puts
Eine solche Wiederholung eines
if
-Modifiers ist allerdings schwer zu lesen, und es ist sinnvoll, die beiden Bedingungen zu einem einzelnen Ausdruck zu kombinieren:
puts message if message and defined? puts
5.1.3 unless
unless
als Anweisung oder Modifier ist das Gegenteil von
if
: Es führt Code nur dann aus, wenn ein zugehöriger Ausdruck
false
oder
nil
ergibt. Seine Syntax entspricht der von
if
, mit der Ausnahme, dass
elsif
-Klauseln nicht erlaubt sind:
# Einweg-unless-Anweisung
unless
Bedingung
Code
end
# Zweiweg-unless-Anweisung
unless
Bedingung
Code
else
Code
end
# unless-Modifier
Code
unless
Bedingung
Die
unless
-Anweisung erfordert wie die
if
-Anweisung, dass die Bedingung und der Code durch einen Zeilenumbruch, ein Semikolon oder das Schlüsselwort
then
voneinander getrennt werden. Und genau wie
if
-Anweisungen sind
unless
-Anweisungen Ausdrücke und geben den Wert des ausgeführten Codes zurück, oder
nil
, wenn sie nichts ausführen:
# Methode to_s für Objekt o aufrufen, es sei denn, o ist nil
s = unless o.nil? # Zeilenumbruchtrenner
o.to_s
end
s = unless o.nil? then o.to_s end # then-Trenner
Für einzeilige Fallentscheidungen wie diese ist die Modifier-Form von
unless
normalerweise klarer:
s = o.to_s unless o.nil?
Ruby besitzt kein Äquivalent der
elsif
-Klausel für eine
unless
-Fallentscheidung. Sie können trotzdem eine Mehrweg-unless-Anweisung schreiben, wenn Sie sich nicht scheuen, etwas geschwätziger zu sein:
unless x == 0
puts "x ist nicht 0"
else
unless y == 0
puts "y ist nicht 0"
else
unless z == 0
puts "z ist nicht 0"
else
puts "Alle sind 0"
end
end
end
5.1.4 case
Die
case
-Anweisung ist eine Mehrweg-Fallentscheidung. Es gibt zwei Formen dieser Anweisung. Die einfache (und selten genutzte) Form ist nichts weiter als eine alternative Syntax für
if/elsif/else
. Diese beiden nebeneinander gezeigten Ausdrücke sind äquivalent:
name = case name = if x == 1 then "eins"
when x == 1 then "eins" elsif x == 2 then "zwei"
when x == 2 then "zwei" elsif x == 3 then "drei"
when x == 3 then "drei" elsif x == 4 then "vier"
when x == 4 then "vier" else "viele"
else "viele" end
end
Wie Sie an diesem Code sehen, gibt die
case
-Anweisung genau wie die
if
-Anweisung einen Wert zurück. Wie bei der
if
-Anweisung kann das Schlüsselwort
then
, das auf die
when
-Klauseln folgt, durch einen Zeilenumbruch oder ein Semikolon ersetzt werden: [ 19 ]
case
when x == 1
"eins"
when x == 2
"zwei"
when x == 3
"drei"
end
Die
case
-Anweisung prüft jeden ihrer
when
-Ausdrücke in der Reihenfolge, in der sie geschrieben werden, bis sie einen findet, der
true
ergibt. Wenn sie einen findet, wertet sie die Anweisungen aus, die zwischen diesem
when
und dem nachfolgenden
when
,
else
oder
end
liegen. Der zuletzt ausgewertete Ausdruck wird zum Rückgabewert der
case
-Anweisung. Nachdem eine
when
-Klausel gefunden wurde, die
true
ergibt, werden keine anderen
when
-Klauseln mehr beachtet.
Die
else
-Klausel einer
case
-Anweisung ist optional, aber wenn sie verwendet wird, muss sie am Ende der Anweisung hinter allen
when
-Klauseln stehen.
Weitere Kostenlose Bücher