scala enums

Comprender enumeraciones scala



enums (1)

Debo 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.

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

  • ¿Qué significa type WeekDay = Value y por qué tengo que escribir eso?
  • ¿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é escribe WeekDay.Value , no escribe WeekDay ?

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

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

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

En cambio, una versión mínima sería:

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

y no tiene que importar el contenido del object WeekDay , pero luego necesitará usar el tipo WeekDay.Value y calificar a los miembros individuales. Entonces el ejemplo se convertiría

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 del mismo nombre , Value , que devuelve una instancia concreta de tipo Value .

Ocurre que puede escribir val a, b, c = foo en Scala, y para cada valor a , b , y c se llamará una y otra vez al método foo . Enumeration usa este truco para incrementar un contador interno de modo 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.