Case (más nyelvekben gyakran switch néven ismert) egyfajta vezérlési szerkezet, akárcsak az if-else. A case segítségével több if-else-if utasítást fűzhetsz egymáshoz, ami olvashatóbb is lehet, miközben megmarad a program futásának vezérlése.
A case a case kulcsszóval kezdődik, amelyet egy opcionális kifejezés követ.
Ezután minden ághoz a when kulcsszót használjuk, amelyet egy kifejezés követ, és ezt hasonlítjuk össze a case kifejezésével.
A when kulcsszó ne legyen beljebb húzva, mint a case kulcsszó.
A when kulcsszó után az a kód következik, amely akkor fut le, ha a case kifejezése megegyezik a when kifejezésével.
A case-hez tartozhat egy opcionális else utasítás is, amely akkor fut le, ha egyetlen másik eset sem illeszkedik.
A case kifejezését kiértékeljük, majd minden when kifejezéssel összehasonlítjuk.
Az összehasonlítás a case egyenlőségoperátorával (===) történik.
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
===)A case egyenlőségoperátora (===) kicsit más, mint az egyenlőségoperátor (==).
Ez az operátor azt vizsgálja, hogy a jobb oldal tagja-e a bal oldal által leírt halmaznak.
Ez azt jelenti, hogy korántsem mindegy, hova kerül az egyes operandusok.
Az, hogy hogyan működik, a bal oldal típusától függ: egy Range például azt vizsgálja, hogy a jobb oldal benne van-e a tartományban, egy Object pedig azt, hogy a jobb oldal a Object egy példánya-e.
(1..3) == 1 # => false
(1..3) === 1 # => true
String == "foo" # => false
String === "foo" # => true
A case-ben egyetlen ághoz több kifejezést is megadhatsz, a lehetséges értékeket vesszővel elválasztva. A kód akkor fut le, ha a kifejezések bármelyike illeszkedik. Ez akkor lehet hasznos, ha egy ághoz több lehetséges értéket szeretnél rendelni.
case var
when 1, 2
"One or two"
else
"Other"
end
A case azt is ellenőrizheti, hogy egy érték egy tartományba esik-e. Ehhez csak egy tartományt kell megadnod when kifejezésként.
case var
when 1..3
puts "One to three"
else
puts "Other"
end
Ha nincs szükség case kifejezésre, nyugodtan elhagyhatod. Ekkor minden when kifejezés igazságérték alapján értékelődik ki. Így úgy viselkednek, mint az if-else-if utasítások.
case
when 1 == 1
"One is equal to one"
when 1 > 2
"One is greater than two"
else
"Other"
end
A Ruby lehetővé teszi az egysoros case utasításokat.
Ez akkor jön jól, ha egy egyszerű, egysoros utasításod van.
Az egysoros when utasítás alakja when <expression> then <statement>.
Ha pedig az else utasításban használod, akkor else <statement> a formája.
case var
when 1 then "One"
when 2 then "Two"
else "Other"
end
A case segítségével típusokra is illeszkedhetsz. Ez akkor hasznos, ha egy változó típusától függően más-más viselkedést szeretnél.
case var
when Integer
"Integer"
when String
"String"
else
"Other"
end
Ebben a feladatban egy Blackjack játék első körét fogjuk szimulálni.
Két kártyát kapsz, és látni fogod az osztó felfordított kártyáját. Minden kártyát egy stringgel ábrázolunk, például „ace”, „king”, „three”, „two” és így tovább. Az egyes kártyák értékei:
| kártya | érték | kártya | érték |
|---|---|---|---|
| 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 |
Az ász általában felveheti az 1 vagy a 11 értéket is, de az egyszerűség kedvéért feltesszük, hogy csak a 11 értékét veheti fel.
Valósítsd meg a Blackjack.parse_card metódust, amely argumentumként egy kártyát kap stringként.
A metódusnak a kártya értékét kell visszaadnia egész számként.
Blackjack.parse_card("ace")
# => 11
A játékos pontszámát értéktartományokba kell sorolni. A játékos pontszáma úgy számítódik ki, hogy összeadjuk a játékos két kártyájának értékét. A használt tartományok a következők:
| tartomány | érték |
|---|---|
| low | [4, 11] |
| mid | [12, 16] |
| high | [17, 20] |
| blackjack | [21] |
Valósítsd meg a Blackjack.card_range metódust, amely argumentumként két kártyát kap stringként.
A metódusnak vissza kell adnia annak az értéktartománynak a nevét, amelybe a két kártya esik.
Blackjack.card_range("ten", "king")
# => "high"
A két kártyádtól és az osztó kártyájától függően a játék első körére létezik egy stratégia, amelyben a következő lehetőségeid vannak:
Bár még nem optimális, azt a stratégiát fogod követni, amelyet a barátod, Alex fejlesztett ki, és ami a következő:
Valósítsd meg a Blackjack.first_turn metódust, amely argumentumként három kártyát kap stringként.
A metódusnak a meghozandó döntést kell visszaadnia stringként.
Blackjack.first_turn("ace", "ace", "two")
# => "P"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Ruby nyelvet 21 fogalom121 feladat segítségével, valódi emberi mentorálással, mindez ingyen.