le Enumeration
trait a un membre de type Value
représentant les éléments individuels de l'énumération (c'est en fait une classe interne, mais la différence n'a pas d'importance ici).
Ainsi object WeekDay
hérite cet élément de type. La ligne type WeekDay = Value
n'est qu'un alias de type . C'est utile, car après l'avoir importé ailleurs avec import WeekDay._
, vous pouvez utiliser ce type, par exemple:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Au lieu de cela, une version minimale serait simplement:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
et vous n'avez pas besoin d' importer le contenu de object WeekDay
, mais vous devrez alors utiliser le type WeekDay.Value
et qualifier les membres individuels. Ainsi l'exemple deviendrait
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
La deuxième question concerne la signification de val Mon, ... = Value
. C'est en effet très déroutant si vous ne regardez pas l'implémentation de Enumeration
. Ce n'est pas l'attribution d'un type! Il appelle plutôt une protégée méthode du même nom , Value
qui renvoie une instance de béton de type Value
.
Il se trouve que vous pouvez écrire val a, b, c = foo
à Scala, et pour chaque valeur a
, b
et c
la méthode foo
sera appelée encore et encore. Enumeration
utilise cette astuce pour incrémenter un compteur interne afin que chaque valeur soit individuelle.
Si vous ouvrez la documentation de l'API Scala pour Enumeration
et cliquez sur Visibility: All
, vous verrez cette méthode apparaître.