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é escribeWeekDay.Value
, no escribeWeekDay
?
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.