Case (in anderen Sprachen oft als switch bezeichnet) ist eine Form von Kontrollausdruck, ähnlich wie if-else. Mit Case lassen sich mehrere if-else-if-Anweisungen verketten. Das kann lesbarer sein und übernimmt trotzdem die Ablaufsteuerung.
Ein Case wird durch das Schlüsselwort case definiert, auf das ein optionaler Ausdruck folgt.
Dann wird für jeden Fall das Schlüsselwort when verwendet, gefolgt von einem Ausdruck, der mit dem Case-Ausdruck verglichen wird.
Das Schlüsselwort when sollte nicht gegenüber dem Schlüsselwort case eingerückt werden.
Auf das Schlüsselwort when folgt der Code, der ausgeführt werden soll, wenn der Case-Ausdruck mit dem when-Ausdruck übereinstimmt.
Case erlaubt eine optionale else-Anweisung, die ausgeführt wird, wenn kein anderer Fall passt.
Der Case-Ausdruck wird ausgewertet und dann mit jedem when-Ausdruck verglichen.
Der Vergleich erfolgt mit dem Case-Gleichheitsoperator (===).
value = 1
case value
when 1
"One"
when 2
"Two"
else
"Other"
end
# This is the same as:
value = 1
if 1 === value
"One"
elsif 2 === value
"Two"
else
"Other"
end
===)Der Case-Gleichheitsoperator (===) unterscheidet sich etwas vom Gleichheitsoperator (==).
Der Operator prüft, ob die rechte Seite ein Element der Menge ist, die von der linken Seite beschrieben wird.
Das bedeutet, dass es eine Rolle spielt, auf welcher Seite jeder Operand steht.
Wie das funktioniert, hängt vom Typ der linken Seite ab. Eine Range prüft zum Beispiel, ob die rechte Seite im Bereich liegt, und ein Object prüft, ob die rechte Seite eine Instanz des Object ist.
(1..3) == 1 # => false
(1..3) === 1 # => true
String == "foo" # => false
String === "foo" # => true
Mit Case lassen sich mehrere Ausdrücke in einem einzigen Case abgleichen, wobei jeder mögliche Wert durch ein Komma getrennt wird. Der Code wird ausgeführt, wenn einer der Ausdrücke passt. Das ist nützlich, wenn ein einzelner Fall mehrere mögliche Werte haben soll.
case var
when 1, 2
"One or two"
else
"Other"
end
Mit Case lässt sich auch prüfen, ob ein Wert in einem Bereich liegt. Dazu verwendest du einen Bereich als when-Ausdruck.
case var
when 1..3
puts "One to three"
else
puts "Other"
end
Wenn kein Case-Ausdruck benötigt wird, kannst du ihn weglassen. In diesem Fall wird jeder when-Ausdruck darauf geprüft, ob er wahr ist. Und sie verhalten sich dann wie if-else-if-Anweisungen.
case
when 1 == 1
"One is equal to one"
when 1 > 2
"One is greater than two"
else
"Other"
end
Ruby erlaubt einzeilige Case-Anweisungen.
Das kannst du verwenden, wenn du eine einfache einzeilige Anweisung hast.
Die einzeilige when-Anweisung wird als when <expression> then <statement> geschrieben.
Und in der else-Anweisung wird sie als else <statement> geschrieben.
case var
when 1 then "One"
when 2 then "Two"
else "Other"
end
Mit Case lässt sich auch nach Typen abgleichen. Das ist nützlich, wenn du je nach Typ einer Variable ein unterschiedliches Verhalten möchtest.
case var
when Integer
"Integer"
when String
"String"
else
"Other"
end
In dieser Übung simulieren wir den ersten Zug eines Blackjack-Spiels.
Du erhältst zwei Karten und kannst die offene Karte des Dealers sehen. Alle Karten werden als String dargestellt, zum Beispiel „ace“, „king“, „three“, „two“ usw. Die Werte der einzelnen Karten sind:
| Karte | Wert | Karte | Wert |
|---|---|---|---|
| ace | 11 | eight | 8 |
| two | 2 | nine | 9 |
| three | 3 | ten | 10 |
| four | 4 | jack | 10 |
| five | 5 | queen | 10 |
| six | 6 | king | 10 |
| seven | 7 | other | 0 |
Üblicherweise können ace-Karten den Wert 1 oder 11 haben, aber der Einfachheit halber gehen wir davon aus, dass sie nur den Wert 11 haben können.
Implementiere die Methode Blackjack.parse_card, die eine Karte als String als Argument entgegennimmt.
Die Methode sollte den Wert der Karte als Ganzzahl zurückgeben.
Blackjack.parse_card("ace")
# => 11
Der Punktestand des Spielers muss in Wertebereiche eingeteilt werden. Der Punktestand eines Spielers wird berechnet, indem die Werte der beiden Spielerkarten addiert werden. Folgende Bereiche werden verwendet:
| Bereich | Wert |
|---|---|
| low | [4, 11] |
| mid | [12, 16] |
| high | [17, 20] |
| blackjack | [21] |
Implementiere die Methode Blackjack.card_range, die zwei Karten als Strings als Argumente entgegennimmt.
Die Methode sollte den Namen des Wertebereichs zurückgeben, in den die beiden Karten fallen.
Blackjack.card_range("ten", "king")
# => "high"
Abhängig von deinen beiden Karten und der Karte des Dealers gibt es für den ersten Zug des Spiels eine Strategie, bei der du die folgenden Optionen hast:
Auch wenn sie noch nicht optimal ist, folgst du der Strategie, die dein Freund Alex entwickelt hat, und die wie folgt aussieht:
Implementiere die Methode Blackjack.first_turn, die drei Karten als Strings als Argumente entgegennimmt.
Die Methode sollte die Entscheidung, die du treffen solltest, als String zurückgeben.
Blackjack.first_turn("ace", "ace", "two")
# => "P"
Melde dich bei Exercism an, um Ruby mit 21 Konzepte121 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.