il Enumeration
tratto ha un membro di tipo che Value
rappresenta i singoli elementi dell'enumerazione (in realtà è una classe interna, ma la differenza non ha importanza qui).
Quindi object WeekDay
eredita quel tipo di membro. La linea type WeekDay = Value
è solo un alias di tipo . È utile, perché dopo averlo importato altrove con import WeekDay._
, puoi usare quel tipo, ad esempio:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Invece, una versione minima sarebbe semplicemente:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
e non è necessario importare il contenuto di object WeekDay
, ma successivamente sarà necessario utilizzare il tipo WeekDay.Value
e per qualificare i singoli membri. Quindi l'esempio diventerebbe
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
La seconda domanda riguarda il significato di val Mon, ... = Value
. Questo è davvero molto confuso se non si guarda all'implementazione di Enumeration
. Questa non è l'assegnazione di un tipo! E 'invece un chiamando protetta metodo con lo stesso nome , Value
che restituisce un esempio concreto di tipo Value
.
Accade così che è possibile scrivere val a, b, c = foo
a Scala, e per ogni valore a
, b
e c
il metodo foo
sarà chiamato ancora e ancora. Enumeration
usa questo trucco per incrementare un contatore interno in modo che ogni valore sia individuale.
Se apri i documenti dell'API Scala per Enumeration
e fai clic su Visibility: All
, vedrai apparire quel metodo.