Coincidencia exhaustiva
Completitud comprobada por el compilador
Coincidencia exhaustiva es una lección gratuita de Scala for Backend Engineering & Functional Programming en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Scala for Backend Engineering & Functional Programming, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.
¿Qué es el pattern matching exhaustivo?
Un match es exhaustivo cuando gestiona todos los valores posibles del tipo analizado.
En un sealed trait, el compilador conoce todas las variantes y puede comprobar que el match las cubre todas.
Un match completo
Cuando gestiona todas las variantes de un sealed trait, el compilador lo acepta y no aparece ninguna advertencia.
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))
}
}El compilador le respalda
Si omite una variante, el compilador emite una advertencia de match no exhaustivo durante la compilación.
Es una red de seguridad: detecta la omisión antes de ejecutar el programa.
Añadir una variante más adelante
La verdadera ventaja se aprecia al añadir una variante nueva. Todos los matches no exhaustivos del código mostrarán una advertencia para recordarle que debe gestionar el nuevo caso.
Esto hace que la refactorización sea segura y predecible.
Por qué evitar un comodín
Añadir case _ => silencia las advertencias de exhaustividad. Esto puede ocultar errores al añadir variantes más adelante.
En los ADT sellados, es preferible enumerar explícitamente cada variante para que el compilador siga protegiéndole.
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))
}
}Exhaustividad con datos
La exhaustividad también se aplica a las variantes que contienen datos. Puede enlazar los campos, pero aun así debe cubrir todas las variantes.
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)))
}
}Combinar con guards
Tenga cuidado: los guards pueden hacer que un match no sea exhaustivo, porque el compilador no puede demostrar que cubran todos los valores.
Proporcione un caso final sin guard para la misma variante a fin de mantener la exhaustividad.
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)))
}
}Exhaustividad con Option
El Option de la biblioteca estándar es un ADT sellado con Some y None. Hacer match sobre ambos lo hace exhaustivo.
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))
}
}Exhaustividad anidada
La exhaustividad también resulta útil con ADT anidados. El compilador razona sobre cada nivel que desestructura.
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))))
}
}Por qué es importante
La exhaustividad comprobada por el compilador le proporciona:
- La confianza de que se gestiona cada caso
- Recordatorios automáticos cuando el ADT crece
- Menos MatchErrors en tiempo de ejecución
- Refactorizaciones a gran escala más seguras
Unirlo todo
Un ADT sellado con cobertura completa. Añadir una variante nueva activaría aquí una advertencia del compilador.
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)))
}
}Comprobación rápida
Compruebe su comprensión del pattern matching exhaustivo.
Resumen
Ha aprendido sobre el pattern matching exhaustivo:
- Un match es exhaustivo cuando cubre todas las variantes
- En los sealed trait, el compilador lo comprueba y advierte de las omisiones
- Añadir una variante revela todos los matches incompletos
- Evite
case _en los ADT sellados para conservar esta protección - Los guards pueden romper la exhaustividad; añada un caso final sin guard
Preguntas frecuentes
¿La lección «Coincidencia exhaustiva» es gratis?
Sí — el texto completo de «Coincidencia exhaustiva» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Scala for Backend Engineering & Functional Programming, actualiza a CoddyKit PRO. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.
¿Qué aprenderé en «Coincidencia exhaustiva»?
Completitud comprobada por el compilador Practicas Scala for Backend Engineering & Functional Programming con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Scala for Backend Engineering & Functional Programming?
No se requiere experiencia previa. Scala for Backend Engineering & Functional Programming en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Coincidencia exhaustiva»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Scala for Backend Engineering & Functional Programming?
Sí. Cada lección de Scala for Backend Engineering & Functional Programming incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Clases case
- Traits sellados
- Tipos de datos algebraicos
- Coincidencia exhaustiva