Ca

Case ebben a kurzusban: Crystal

1 feladat

A(z) Case fogalomról

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

A 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éssel

A 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ányokkal

A 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ül

Ha 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

Egysoros 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ípusokkal

A 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

Implicit objektum

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

Kimerítő 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
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Case fogalmat

A gyakorlás zárolva

Oldj fel még 6 feladatot, hogy gyakorolhasd a(z) Case fogalmat