2012-06-16 17 views
120

Tengo que decir que no entiendo las clases de enumeración de Scala. Puedo copiar y pegar el ejemplo de la documentación, pero no tengo idea de lo que está pasando.Comprensión de las enumeraciones scala

object WeekDay extends Enumeration { 
    type WeekDay = Value 
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value 
} 
import WeekDay._ 
  • Lo que significa type WeekDay = Value y por qué tengo que escribir?
  • ¿Por qué val Mon = Value? ¿Y eso que significa?
  • ¿Por qué tengo que importar el objeto WeekDay ? Y,
  • cuando escribo val day = WeekDay.Mon, ¿por qué es el tipo WeekDay.Value, no el tipo WeekDay?
+2

He escrito un pequeño resumen sobre la enumeración de Scala y sus alternativas, puede que le resulte útil: pedrorijo.com/blog/scala-enums/ – pedrorijo91

Respuesta

149

el rasgo Enumeration tiene un elemento de tipo Value que representa los elementos individuales de la enumeración (en realidad es una clase interna, pero la diferencia no importa aquí).

Por lo tanto, object WeekDay hereda ese tipo de miembro. La línea type WeekDay = Value es solo un alias de tipo . Es útil, porque después de importar en otro lugar con import WeekDay._, puede utilizar ese tipo, por ejemplo:

def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun) 

En su lugar, una versión mínima sería simplemente:

object WeekDay extends Enumeration { 
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value 
} 

y no hacer han a importe los contenidos de object WeekDay, pero luego deberá usar el tipo WeekDay.Value y calificar miembros individuales. Así que el ejemplo se convertiría en

def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun) 

La segunda pregunta es sobre el significado de val Mon, ... = Value. Esto de hecho es muy confuso si no observa la implementación de Enumeration. ¡Esta no es la asignación de un tipo! En su lugar, llama a un método protegido con el mismo nombre, Value, que devuelve una instancia concreta del tipo Value.

Se da la circunstancia de que puede escribir val a, b, c = foo en Scala, y para cada valor a, b, y el método cfoo se llamará una y otra vez. Enumeration usa este truco para incrementar un contador interno para que cada valor sea individual.

Si abre los documentos de la API de Scala para Enumeration y hace clic en Visibility: All, verá que aparece ese método.

+2

Gracias, esto es muy confuso pero creo que es correcto. Utilizaré clases de casos sellados, parece 100% más fácil. –

+2

Yo personalmente prefiero las clases de estuche sellado, también. Un poco más detallado, pero menos hokus-pokus con contadores internos mutables, etc. Con Scala 2.10, hay algunas ideas sobre cómo las enumeraciones (que a diferencia de Java no son una construcción de lenguaje sino solo una solución de biblioteca) se pueden escribir mejor usando macros. –

+0

@ 0__ ¿Puedo preguntar por qué y cómo se usa la clase sellada para reemplazar a Enum en Scala? ¿Hay algo malo con la enumeración de Scala? – x1a0

Cuestiones relacionadas