scala sealed traits

scala - ¿Qué es un rasgo sellado?



sealed traits (5)

¿Un rasgo sellado es lo mismo que una clase sellada?

En cuanto a lo sealed va, sí. Ellos comparten las diferencias normales entre trait y class , por supuesto.

O, si no, ¿cuáles son las diferencias?

Discutible.

¿Cuándo es una buena idea usar un rasgo sellado (y cuándo no)?

Si tiene una sealed class X , entonces debe verificar X y también las subclases. Lo mismo no se sealed abstract class X sealed trait X o al sealed trait X . Por lo tanto, podría sealed abstract class X , pero eso es mucho más detallado que solo un trait y para poca ventaja.

La principal ventaja de usar una abstract class sobre un trait es que puede recibir parámetros. Esa ventaja es particularmente relevante cuando se usan clases de tipo. Digamos que quieres construir un árbol ordenado, por ejemplo. Puedes escribir esto:

sealed abstract class Tree[T : Ordering]

pero no puedes hacer esto

sealed trait Tree[T : Ordering]

ya que los límites de contexto (y los límites de vista) se implementan con parámetros implícitos. Dado que los rasgos no pueden recibir parámetros, no se puede hacer eso.

Personalmente, prefiero el sealed trait y lo uso a menos que alguna razón particular me haga usar una sealed abstract class . Y no estoy hablando de razones sutiles, sino de razones en su cara que no puede ignorar, como el uso de clases de texto.

Las clases selladas se describen en ''Programación en Scala'', pero los rasgos sellados no lo son. ¿Dónde puedo encontrar más información sobre un rasgo sellado?

Me gustaría saber si un rasgo sellado es lo mismo que una clase sellada. O, si no, ¿cuáles son las diferencias? ¿Cuándo es una buena idea usar un rasgo sellado (y cuándo no)?


Desde el blog de Daily Scala :

Cuando un rasgo está "sellado", todas sus subclases se declaran dentro del mismo archivo y eso hace que el conjunto de subclases sea finito, lo que permite ciertas comprobaciones del compilador.



brevemente:

  • Los rasgos sellados solo pueden extenderse en el mismo archivo
  • Listar esto permite al compilador conocer fácilmente todos los subtipos posibles.
  • Use rasgos sellados cuando el número de subtipos posibles sea finito y conocido de antemano
  • Una forma de crear algo como enum en Java.
  • Ayuda para definir tipos de datos algebraicos (TDA)

y para más detalles, todo sobre rasgos sellados en Scala.


Un rasgo sealed puede extenderse solo en el mismo archivo que su declaración.

A menudo se utilizan para proporcionar una alternativa a las enums . Dado que solo pueden extenderse en un solo archivo, el compilador conoce todos los subtipos posibles y puede razonar al respecto.

Por ejemplo con la declaración:

sealed trait Answer case object Yes extends Answer case object No extends Answer

El compilador emitirá una advertencia si una coincidencia no es exhaustiva:

scala> val x: Answer = Yes x: Answer = Yes scala> x match { | case No => println("No") | } <console>:12: warning: match is not exhaustive! missing combination Yes

Por lo tanto, debe usar rasgos sellados (o clase abstracta sellada) si el número de subtipos posibles es finito y conocido de antemano. Para más ejemplos, puede echar un vistazo a las implementaciones de list y option .