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 c
foo
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.
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