In Gleam kannst du mit einem case-Ausdruck Code bedingt ausführen. Mit einem case-Ausdruck kann ein Wert gegen ein oder mehrere Muster geprüft werden. Ein Beispiel für so ein Muster ist das Literalmuster, das einen Wert mit einem literalen Wert vergleicht (z. B. 1 oder "hello").
Case-Ausdrücke werden mit dem Schlüsselwort case geschrieben:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
1 -> "One"
}
}
Auch wenn das wie switch-Anweisungen in anderen Sprachen aussehen mag, zeigt der Musterabgleich erst seine Stärke, wenn du auch andere Muster verwendest. Ein solches Muster ist das Variablenmuster, mit dem du einer Variablen einen Wert zuweisen kannst. In diesem Beispiel bekommt die Variable i den Wert von number, wenn number nicht 0 ist:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
Manchmal möchtest du einem Muster eine zusätzliche Bedingung hinzufügen. Das nennt man einen Guard (eine Klausel), den du mit dem Schlüsselwort if hinzufügen kannst:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
Aus Performancegründen sind in Guards nur grundlegende mathematische und boolesche Operatoren erlaubt, andere Funktionen kannst du in Guards nicht verwenden.
Im obigen Beispiel gibt es nicht für jede mögliche Eingabe ein passendes Muster. Der Compiler erkennt das und gibt einen Fehler aus. Das nennt man Vollständigkeitsprüfung. Um die Warnung zu beheben, musst du alle Fälle abdecken. Dafür kannst du das Verwerfungsmuster verwenden, ein Muster, das auf jeden Wert passt:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
In einer Klausel kannst du mehrere Muster abgleichen, indem du sie mit | voneinander trennst. Pro Klausel ist nur ein Guard möglich:
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
Case-Ausdrücke prüfen einen Wert von oben nach unten gegen jedes Muster, bis sie ein passendes Muster finden und die dazugehörige Logik ausführen. Die Reihenfolge der Muster ist wichtig!
In dieser Übung spielst du mit einer Freundin oder einem Freund ein Zahlenratespiel. Die Regeln sind einfach: du wählst heimlich eine Zahl zwischen 1 und 100 und deine Freundin oder dein Freund versucht zu erraten, welche Zahl du gewählt hast. Um deiner Freundin oder deinem Freund zu helfen, antwortest du unterschiedlich, je nachdem, wie nah der Tipp an der Zahl ist, die du gewählt hast (42). Das sind die Regeln für die verschiedenen Antworten:
42 ist: „Correct“41 oder 43 ist: „So close“41 ist: „Too low“43 ist: „Too high“Du hast vier Aufgaben, um die Antworten auf die Tipps umzusetzen.
Implementiere die Funktion reply, um auf einen richtigen Tipp zu antworten:
reply(42)
// -> "Correct"
Ändere die Funktion reply, um auf fast richtige Tipps zu antworten:
reply(41)
// -> "So close"
Ändere die Funktion reply, um auf zu niedrige Tipps zu antworten:
reply(25)
// -> "Too low"
Ändere die Funktion reply, um auf zu hohe Tipps zu antworten:
reply(88)
// -> "Too high"
Melde dich bei Exercism an, um Gleam mit 33 Konzepte122 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.