es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Correspondencia exhaustiva de patrones cuando está presente una instancia de trait sellado deprecado.

Supongamos el siguiente escenario:

sealed trait Status

case object Active extends Status
case object Inactive extends Status
@scala.deprecated("deprecated because reasons")
case object Disabled extends Status 

Teniendo en cuenta que el objeto Disabled no se puede eliminar y dado que val status: Status = getStatus, hay uno de los siguientes problemas:

  1. Falla con match no exhaustivo:
status match {
case Active => ???
case Inactive => ???
}
  1. Falla con el valor deprecated siendo usado:
status match {
case Active => ???
case Inactive => ???
case Disabled => ???
}
  1. Pérdida de seguridad en tiempo de compilación:
status match {
case Active => ???
case Inactive => ???
case _ => ???
}

¿Se puede lograr una coincidencia exhaustiva de seguridad de tipos en este escenario?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, se puede lograr una coincidencia exhaustiva segura en este escenario utilizando guardias de patrón. Las guardias de patrón permiten agregar condiciones adicionales a una coincidencia de patrones. En este caso, podemos agregar un guardia para verificar si el estado no es el objeto Disabled:

    status match {
      case Active => ???
      case Inactive => ???
      case disabledObj if disabledObj == Disabled => // manejar el estado obsoleto "Disabled" aquí
    }
    

    Al agregar el guardia if disabledObj == Disabled, podemos manejar el objeto Disabled obsoleto por separado manteniendo al mismo tiempo la seguridad de tipos y la coincidencia exhaustiva.

Comments are closed.