l' Enumeration
trait a un membre de type Value
représentant les différents éléments de l'énumération (c'est en fait un intérieur de classe, mais la différence n'a pas d'importance ici).
Ainsi, object WeekDay
hérite de ce type de membre. La ligne type WeekDay = Value
est juste un alias de type. Il est utile, car après l'importation d'ailleurs avec import WeekDay._
, vous pouvez utiliser ce type, comme par exemple:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Au lieu de cela, une version minimale serait juste:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
et vous n' avez qu'à importer le contenu d' object WeekDay
, mais vous devez utiliser le type WeekDay.Value
et de qualifier les membres individuels. Ainsi, l'exemple devient
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
La deuxième question porte sur le sens de l' val Mon, ... = Value
. C'est en effet très déroutant si vous ne regardez pas dans la mise en œuvre de l' Enumeration
. Ce n'est pas l'attribution d'un type de! Il s'agit plutôt d'appeler un protégé de la méthode du même nom, Value
, qui renvoie un béton instance de type Value
.
Il se trouve que vous pouvez écrire val a, b, c = foo
en Scala, et, pour chaque valeur a
, b
, et c
méthode foo
sera appelée de nouveau et de nouveau. Enumeration
utilise cette astuce pour incrémenter un compteur interne, de sorte que chaque valeur est individuelle.
Si vous ouvrez la Scala API docs pour Enumeration
et cliquez sur Visibility: All
, vous verrez que la méthode figurant.