il Enumerationtratto ha un membro di tipo che Valuerappresenta i singoli elementi dell'enumerazione (in realtà è una classe interna, ma la differenza non ha importanza qui).
Quindi object WeekDayeredita 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.Valuee 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 , Valueche restituisce un esempio concreto di tipo Value.
Accade così che è possibile scrivere val a, b, c = fooa Scala, e per ogni valore a, be cil metodo foosarà chiamato ancora e ancora. Enumerationusa questo trucco per incrementare un contatore interno in modo che ogni valore sia individuale.
Se apri i documenti dell'API Scala per Enumeratione fai clic su Visibility: All, vedrai apparire quel metodo.