case (más nyelvekben gyakran switch néven ismert) egy vezérlési kifejezés, akárcsak az if-else.
A case lehetővé teszi több if-else-if utasítás láncolását, olvashatóbb lehet, és hatékony szerkezeteket tesz lehetővé.
A case-t a case kulcsszó vezeti be, amelyet egy opcionális kifejezés követ.
Ezután minden ágnál a when kulcsszót használjuk, amelyet egy kifejezés követ; ezt hasonlítja össze a program 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 áll, amely akkor fut le, ha a case kifejezés megegyezik a when kifejezéssel.
A case megenged egy opcionális else ágat is, amely akkor fut le, ha egyetlen másik ág sem illeszkedik.
A case kifejezés kiértékelése után a program összehasonlítja minden when kifejezéssel.
Az összehasonlítás a case-illesztés operátorával (===) történik.
case 1
when 1
puts "One"
when 2
puts "Two"
else
puts "Other"
end
# => One
# This is the same as:
tmp = 1
if 1 === tmp
puts "One"
elsif 2 === tmp
puts "Two"
else
puts "Other"
end
case-illesztés operátora (===)A case-illesztés operátora (===) némileg eltér az egyenlőség operátorától (==).
Ez az operátor azt vizsgálja, hogy a jobb oldal eleme-e a bal oldal által leírt halmaznak.
Ez azt jelenti, hogy számít, melyik operandus hova kerül.
A működés a bal oldal típusától függ: például egy Range azt ellenőrzi, 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
case több kifejezésselA case lehetővé teszi, hogy egyetlen ágban több kifejezést adjunk meg, az egyes 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ék tartozik.
case 1
when 1, 2
puts "One or two"
else
puts "Other"
end
case tartományokkalA case azt is ellenőrizheti, hogy egy érték benne van-e egy tartományban.
Ehhez a when kifejezésként egy tartományt adunk meg.
case var
when 1..3
puts "One to three"
else
puts "Other"
end
case kifejezés elhagyásaHa nincs szükség a case kifejezésre, el is hagyható.
Ekkor minden when kifejezés igaz vagy hamis értéke dönt az illeszkedésről, így úgy viselkednek, mint az if-else-if utasítások.
case
when 1 == 1
puts "One is equal to one"
when 1 > 2
puts "One is greater than two"
else
puts "Other"
end
when
A Crystal megengedi az egysoros case utasításokat.
Ez akkor hasznos, ha egy egyszerű, egysoros utasításod van.
Egysoros formában a when ágat így írod le: when <expression> then <statement>.
Az else ágban pedig így: else <statement>.
case var
when 1 then puts "One"
when 2 then puts "Two"
else puts "Other"
end
case típusokkalA case lehetővé teszi a típusok szerinti illesztést.
Az összehasonlítás az is_a? operátort használja a változó típusának ellenőrzésére.
Ez például lehetővé teszi, hogy egy uniótípus minden típusához külön ágat írjunk.
case var
when Int32
puts "Int32"
when String
puts "String"
else
puts "Other"
end
A case lehetővé teszi egy implicit objektum használatát.
Ennek köszönhetően például egy when kifejezés metódushívás lehet a case kifejezésen.
Attól függően, hogy a metódus igaz vagy hamis értéket ad vissza, az ág illeszkedni fog vagy sem.
case 1
when .odd?
puts "Odd"
when .even?
puts "Even"
end
Ebben a feladatban egy Blackjack-játék első körét szimuláljuk.
Két kártyát kapsz, és látni fogod az osztó felfordított lapját. A kártyákat stringként adjuk meg, 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 | egyéb | 0 |
Az ászok általában 1-et vagy 11-et érhetnek, de az egyszerűség kedvéért most azt feltételezzük, hogy csak 11-et érhetnek.
Valósítsd meg a Blackjack.parse_card metódust, amely argumentumként egy kártyát kap stringként.
A metódusnak egész számként kell visszaadnia a kártya értékét.
Blackjack.parse_card("ace")
# => 11
A játékos pontszámát értéktartományokba kell sorolni. A játékos pontszámát úgy számítjuk ki, hogy összeadjuk a két játékoskártya értékét. A használt tartományok:
| 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ó lapjától függően létezik egy stratégia a játék első körére, amelyben a következő lehetőségeid vannak:
Bár még nem optimális, azt a stratégiát követed, amelyet Alex barátod dolgozott ki, és amely 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 stringként kell visszaadnia a meghozandó döntést.
Blackjack.first_turn("ace", "ace", "two")
# => "P"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Crystal nyelvet 26 fogalom142 feladat segítségével, valódi emberi mentorálással, mindez ingyen.