A Gleamben a case kifejezéssel feltételesen hajthatsz végre kódot. Egy case kifejezéssel egy értéket egy vagy több mintával lehet összevetni. Ilyen minta például a literál minta, amely egy értéket egy literál értékkel vet össze (pl. 1 vagy "hello").
A case kifejezéseket a case kulcsszóval írod le:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
1 -> "One"
}
}
Bár ez más nyelvek switch utasításaira hasonlíthat, a mintaillesztés akkor mutatja meg igazi erejét, amikor más mintákat is használsz. Ilyen minta a változóminta, amellyel egy értéket rendelhetsz egy változóhoz. Ebben a példában az i változó a number értékét kapja, ha az nem 0:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
Bizonyos esetekben további feltételt szeretnél adni egy mintához. Ezt nevezik guardnak (klauzula), amelyet az if kulcsszóval adhatsz hozzá:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
Teljesítménybeli okokból a guardokban csak alapvető matematikai és logikai operátorok engedélyezettek, más függvények nem használhatók guardokban.
A fenti példában nem minden lehetséges bemenethez tartozik illeszkedő minta. A fordító ezt észleli, és hibát jelez. Ezt nevezik kimerítő ellenőrzésnek. A figyelmeztetés megoldásához minden esetet kezelni kell. Erre az eldobó minta használható, amely bármely értékre illeszkedik:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
Egy klauzulában több mintát is össze lehet vetni, a mintákat a | választja el egymástól. Egy klauzulához csak egy guard adható:
pub fn describe(number: Int) -> String {
let yell = True
case number {
0 -> "Zero"
3 | 5 -> "One of the first odd prime numbers"
2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
A case kifejezések felülről lefelé vetik össze az értéket minden mintával, amíg illeszkedő mintát nem találnak, majd végrehajtják a hozzá tartozó logikát. A minták sorrendje számít!
Ebben a feladatban egy számkitalálós játékot játszol egy barátoddal. A szabályok egyszerűek: titokban választasz egy számot 1 és 100 között, és a barátod megpróbálja kitalálni, hogy melyik számot választottad. Hogy segíts a barátodnak, különbözőképpen válaszolsz attól függően, hogy mennyire volt közel a tipp a választott számodhoz (42). Ezek a szabályok a különböző válaszokhoz:
42: "Correct"41 vagy 43: "So close"41: "Too low"43: "Too high"Négy feladatod van, hogy kódold a tippekre adott válaszokat.
Valósítsd meg a reply függvényt, hogy válaszolj egy helyes tippre:
reply(42)
// -> "Correct"
Módosítsd a reply függvényt, hogy válaszolj a közeli tippekre:
reply(41)
// -> "So close"
Módosítsd a reply függvényt, hogy válaszolj a túl alacsony tippekre:
reply(25)
// -> "Too low"
Módosítsd a reply függvényt, hogy válaszolj a túl magas tippekre:
reply(88)
// -> "Too high"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Gleam nyelvet 33 fogalom122 feladat segítségével, valódi emberi mentorálással, mindez ingyen.