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ó definiálja, amelyet egy opcionális kifejezés követ.
Ezután minden ághoz a when kulcsszót használjuk, amelyet egy kifejezés követ, amit a case kifejezéssel hasonlítunk össze.
A when kulcsszót nem húzzuk beljebb a case kulcsszónál.
A when kulcsszó után az a kód áll, amely akkor fut le, ha a case kifejezés illeszkedik a when kifejezésre.
A case opcionálisan else ágat is tartalmazhat, amely akkor fut le, ha egyetlen másik ág sem illeszkedik.
A case kifejezés kiértékelődik, majd összehasonlítjuk mindegyik when kifejezéssel.
Az összehasonlítás a case szubszumciós operátorral (===) 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 szubszumciós operátor (===)A case szubszumciós operátor (===) kicsit eltér az egyenlőség operátortól (==).
Az operátor azt ellenőrzi, hogy a jobb oldali érték tagja-e a bal oldal által leírt halmaznak.
Ez azt jelenti, hogy egyáltalán nem mindegy, melyik operandus melyik oldalra kerül.
A működése a bal oldal típusától függ: egy Range például azt ellenőrzi, hogy a jobb oldali érték benne van-e a tartományban, egy Object pedig azt, hogy a jobb oldali érték a Object példánya-e.
(1..3) == 1 # => false
(1..3) === 1 # => true
String == "foo" # => false
String === "foo" # => true
case több kifejezésselA case egyetlen ágban több kifejezést is illeszthet, a lehetséges értékeket vesszővel elválasztva.
A kód akkor fut le, ha a kifejezések bármelyike illeszkedik.
Ez hasznos lehet, 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.
Ezt úgy érhetjük el, hogy a when kifejezés egy tartomány.
case var
when 1..3
puts "One to three"
else
puts "Other"
end
case kifejezés nélkülHa nincs szükség case kifejezésre, el is hagyhatjuk.
Ilyenkor a when-ek kifejezéseit igazságértékük alapján értékeljük ki.
Ezáltal ú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 lehetővé teszi az egysoros case utasításokat.
Akkor használható, ha egy egyszerű, egysoros utasításod van.
Az egysoros when ágat így írjuk: when <expression> then <statement>.
Az else ágnál pedig így: else <statement>.
case var
when 1 then puts "One"
when 2 then puts "Two"
else puts "Other"
end
case típusokkalA case típusokra is illeszthet.
Az összehasonlítás az is_a? operátorral ellenőrzi a változó típusát.
Ez például lehetővé teszi, hogy egy union típus minden tagjához külön ág legyen.
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.
Ez például lehetővé teszi, hogy a when kifejezés egy metódushívás legyen a case kifejezésen.
Attól függően, hogy a metódus igaz vagy hamis értéket ad vissza, az ág illeszkedik-e vagy sem.
case 1
when .odd?
puts "Odd"
when .even?
puts "Even"
end
case
A case lehetővé teszi a kimerítő illesztést, ami azt jelenti, hogy biztosíthatjuk, hogy minden lehetséges értéket kezeljünk.
Ez hasonló a when ághoz, de when helyett in kulcsszót használ.
Ha egy case kimerítő, nem támogatja sem a when, sem az else ágat.
A kimerítő illesztés Bools, Union típusokon, Enum-on és Tuples-en használható.
Az utóbbi kettőt későbbi fogalmaknál tárgyaljuk.
A kimerítő illesztés azt jelenti, hogy minden lehetőséget kezelni kell, különben fordítási hiba keletkezik.
A Union típusok kimerítő illesztése hasonló a nem kimerítőhöz.
var : (Int32 | String | Bool)
case var
in Int32
puts "Int32"
in String
puts "String"
in Bool
puts "Bool"
end
A Bools kimerítő illesztéssel kezelhető a true és false kulcsszavakkal.
var : Bool
case var
in true
puts "True"
in false
puts "False"
end