Einer von mehreren Fällen
Ein Typ kann die Fälle auflisten, die ein Wert sein kann, etwa sonnig oder regnerisch, und match tut eines pro Fall und sorgt dafür, dass keiner vergessen wird.
Manche Werte sind einer von wenigen Arten: Das Wetter ist sonnig, oder es regnet. Ein Typ kann diese Arten mit
case auflisten. Ein Fall kann eigene Werte mitbringen: Regen kommt mit der Menge, die gefallen ist.
match schaut sich einen Wert an und führt die Zeile des Falls aus, der er ist. In match wird ein Fall mit einem
Punkt davor geschrieben, .Sunny, und die Werte, die er mitbringt, bekommen Namen, wie millimetres.
type Weather {
case Sunny
case Rainy(millimetres: Int)
}
fn advice(weather: Weather): String {
match weather {
.Sunny => "Wear a hat."
.Rainy(millimetres) => "Take an umbrella: {millimetres} mm of rain."
}
}
print advice(Weather.Sunny)
print advice(Weather.Rainy(5))
// prints Wear a hat.
// prints Take an umbrella: 5 mm of rain.Kein Fall vergessen#
Ein match muss jeden Fall behandeln. Fügst du dem Typ einen Fall hinzu und vergisst ihn in einem match, läuft
das Programm nicht, und der Computer nennt den Fall, der fehlt. So kann sich kein neuer Fall unbemerkt einschleichen.
Wie sieht das aus?
type Weather {
case Sunny
case Snowy
}
fn advice(weather: Weather): String {
match weather {
.Sunny => "Wear a hat."
}
}
print advice(Weather.Snowy)
// error: `match` does not handle `.Snowy`Übung#
Füge dem Typ einen Fall Windy hinzu und dem match eine Zeile dafür, sodass das Programm Hold on to your hat.
ausgibt.
type Weather {
case Sunny
case Rainy(millimetres: Int)
}
fn advice(weather: Weather): String {
match weather {
.Sunny => "Wear a hat."
.Rainy(millimetres) => "Take an umbrella: {millimetres} mm of rain."
}
}
print advice(Weather.Sunny)Hold on to your hat.Auf deinem Computer ausführen: torb run one-of-several-cases.trb
Tipp
Schreib case Windy unter die anderen Fälle, füge .Windy => "Hold on to your hat." zum match hinzu und gib
advice(Weather.Windy) aus.
Lösung
type Weather {
case Sunny
case Rainy(millimetres: Int)
case Windy
}
fn advice(weather: Weather): String {
match weather {
.Sunny => "Wear a hat."
.Rainy(millimetres) => "Take an umbrella: {millimetres} mm of rain."
.Windy => "Hold on to your hat."
}
}
print advice(Weather.Windy)
// prints Hold on to your hat.Zusammenfassung#
case listet auf, was ein Wert sein kann, und match führt eine Zeile pro Fall aus und weigert sich, einen zu
vergessen.