Je dois dire que je ne comprends pas les classes d'énumération Scala. Je peux copier-coller l'exemple de la documentation, mais je n'ai aucune idée de ce qui se passe.
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
- Quels moyens
type WeekDay = Value
et pourquoi dois-je écrire cela? - Pourquoi
val Mon = Value
? Qu'est ce que ça veut dire? - Pourquoi dois-je importer l'
WeekDay
objet? Et, - quand j'écris
val day = WeekDay.Mon
, pourquoi est-ce du typeWeekDay.Value
, pas du typeWeekDay
?
Réponses:
le
Enumeration
trait a un membre de typeValue
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 lignetype WeekDay = Value
n'est qu'un alias de type . C'est utile, car après l'avoir importé ailleurs avecimport WeekDay._
, vous pouvez utiliser ce type, par exemple:Au lieu de cela, une version minimale serait simplement:
et vous n'avez pas besoin d' importer le contenu de
object WeekDay
, mais vous devrez alors utiliser le typeWeekDay.Value
et qualifier les membres individuels. Ainsi l'exemple deviendraitLa 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 deEnumeration
. 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 typeValue
.Il se trouve que vous pouvez écrire
val a, b, c = foo
à Scala, et pour chaque valeura
,b
etc
la méthodefoo
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 surVisibility: All
, vous verrez cette méthode apparaître.la source
Open(Mon, 8, 20)
et les jours resteraient une énumération plate.