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?
Kompiliert nicht
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)
Erwartete Ausgabe
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.

Esc