0Pricing
Scala for Backend Engineering & Functional Programming · Lektion

Vollständiges Matching

Vom Compiler geprüfte Vollständigkeit

Vollständiges Matching ist eine kostenlose Scala for Backend Engineering & Functional Programming-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Scala for Backend Engineering & Functional Programming-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.

Was ist vollständiges Matching?

Ein Match ist vollständig, wenn es jeden möglichen Wert des gematchten Typs behandelt.

Bei einem sealed Trait kennt der Compiler alle Varianten und kann prüfen, ob Ihr Match sie alle abdeckt.

Ein vollständiges Match

Wenn Sie jede Variante eines sealed Traits behandeln, ist der Compiler zufrieden und gibt keine Warnung aus.

sealed trait Color
case object Red extends Color
case object Green extends Color
case object Blue extends Color
object Main {
  def name(c: Color): String = c match {
    case Red   => "red"
    case Green => "green"
    case Blue  => "blue"
  }
  def main(args: Array[String]): Unit = {
    println(name(Blue))
  }
}

Der Compiler passt auf

Wenn Sie eine Variante auslassen, gibt der Compiler bereits beim Kompilieren eine Warnung wegen eines nicht vollständigen Matchings aus.

Das ist ein Sicherheitsnetz: Sie erkennen die Lücke, bevor das Programm ausgeführt wird.

Später eine Variante hinzufügen

Der eigentliche Vorteil zeigt sich, wenn Sie eine neue Variante hinzufügen. Jedes nicht vollständige Match in Ihrer Codebasis wird mit einer Warnung markiert und erinnert Sie daran, den neuen Fall zu behandeln.

Dadurch wird Refactoring sicher und vorhersehbar.

Warum Sie einen Wildcard vermeiden sollten

Das Hinzufügen von case _ => unterdrückt Warnungen zur Vollständigkeit. Wenn Sie später Varianten hinzufügen, können dadurch Fehler verborgen bleiben.

Bei sealed ADTs sollten Sie jede Variante ausdrücklich aufführen, damit der Compiler Sie weiterhin schützt.

sealed trait Status
case object Active extends Status
case object Inactive extends Status
object Main {
  def label(s: Status): String = s match {
    case Active   => "on"
    case Inactive => "off"
  }
  def main(args: Array[String]): Unit = {
    println(label(Active))
  }
}

Vollständigkeit bei Datenvarianten

Die Vollständigkeitsprüfung gilt auch für Varianten, die Daten enthalten. Sie binden die Felder und müssen trotzdem jede Variante abdecken.

sealed trait Shape
case class Circle(r: Double) extends Shape
case class Square(s: Double) extends Shape
object Main {
  def area(sh: Shape): Double = sh match {
    case Circle(r) => 3.14159 * r * r
    case Square(s) => s * s
  }
  def main(args: Array[String]): Unit = {
    println(area(Circle(2)))
    println(area(Square(3)))
  }
}

Mit Guards kombinieren

Seien Sie vorsichtig: Guards können ein Match unvollständig machen, weil der Compiler nicht beweisen kann, dass die Guards alle Werte abdecken.

Fügen Sie für dieselbe Variante einen unbedingten abschließenden Fall hinzu, damit das Match vollständig bleibt.

sealed trait Temp
case class Celsius(v: Int) extends Temp
object Main {
  def feel(t: Temp): String = t match {
    case Celsius(v) if v >= 30 => "hot"
    case Celsius(v)            => "not hot"
  }
  def main(args: Array[String]): Unit = {
    println(feel(Celsius(35)))
    println(feel(Celsius(10)))
  }
}

Vollständigkeit mit Option

Option aus der Standardbibliothek ist ein sealed ADT mit Some und None. Wenn Sie auf beide matchen, ist das Match vollständig.

object Main {
  def show(o: Option[Int]): String = o match {
    case Some(v) => s"value $v"
    case None    => "nothing"
  }
  def main(args: Array[String]): Unit = {
    println(show(Some(7)))
    println(show(None))
  }
}

Verschachtelte Vollständigkeit

Die Vollständigkeitsprüfung hilft auch bei verschachtelten ADTs. Der Compiler berücksichtigt jede Ebene, die Sie auflösen.

sealed trait Tree
case object Leaf extends Tree
case class Node(v: Int, l: Tree, r: Tree) extends Tree
object Main {
  def depth(t: Tree): Int = t match {
    case Leaf          => 0
    case Node(_, l, r) => 1 + math.max(depth(l), depth(r))
  }
  def main(args: Array[String]): Unit = {
    println(depth(Node(1, Leaf, Node(2, Leaf, Leaf))))
  }
}

Warum das wichtig ist

Die vom Compiler geprüfte Vollständigkeit bietet Ihnen:

  • Die Gewissheit, dass jeder Fall behandelt wird
  • Automatische Erinnerungen, wenn der ADT erweitert wird
  • Weniger Laufzeitfehler vom Typ MatchError
  • Sichereres Refactoring im großen Maßstab

Alles zusammenführen

Ein sealed ADT mit vollständiger Abdeckung. Das Hinzufügen einer neuen Variante würde hier eine Compiler-Warnung auslösen.

sealed trait Command
case object Start extends Command
case object Stop extends Command
case class SetSpeed(v: Int) extends Command
object Main {
  def run(c: Command): String = c match {
    case Start       => "starting"
    case Stop        => "stopping"
    case SetSpeed(v) => s"speed $v"
  }
  def main(args: Array[String]): Unit = {
    List(Start, SetSpeed(5), Stop).foreach(c => println(run(c)))
  }
}

Schnelltest

Testen Sie Ihr Verständnis des vollständigen Matchings.

Zusammenfassung

Sie haben vollständiges Matching kennengelernt:

  • Ein Match ist vollständig, wenn es jede Variante abdeckt
  • Bei sealed Traits prüft der Compiler dies und warnt bei Lücken
  • Beim Hinzufügen einer Variante werden alle unvollständigen Matches sichtbar
  • Vermeiden Sie case _ bei sealed ADTs, damit dieser Schutz erhalten bleibt
  • Guards können die Vollständigkeit aufheben; fügen Sie einen unbedingten Fallback hinzu

Häufig gestellte Fragen

Ist die Lektion „Vollständiges Matching“ kostenlos?

Ja — der vollständige Text von „Vollständiges Matching“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Scala for Backend Engineering & Functional Programming-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Vollständiges Matching“?

Vom Compiler geprüfte Vollständigkeit Du übst Scala for Backend Engineering & Functional Programming mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Scala for Backend Engineering & Functional Programming zu starten?

Keine Vorkenntnisse erforderlich. Scala for Backend Engineering & Functional Programming auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Vollständiges Matching“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Scala for Backend Engineering & Functional Programming-Lektion Code schreiben und ausführen?

Ja. Jede Scala for Backend Engineering & Functional Programming-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Case Classes
  2. Versiegelte Traits
  3. Algebraische Datentypen
  4. Vollständiges Matching
← Zurück zu Scala for Backend Engineering & Functional Programming