il Enumeration
tratto ha un elemento tipo Value
rappresenta gli elementi individuali del censimento (in realtà è una classe interna, ma la differenza non importa qui).
Così object WeekDay
eredita quel membro del tipo. La riga type WeekDay = Value
è solo un alias di tipo . E 'utile, perché dopo averlo importato altrove con import WeekDay._
, è possibile utilizzare questo tipo, ad esempio:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
invece, una versione minimale sarebbe solo:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
e non fare hanno a importare il contenuto di object WeekDay
, ma sarà necessario utilizzare il tipo WeekDay.Value
e 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 esamina l'implementazione di Enumeration
. Questo non è l'incarico di un tipo! Si chiama invece un metodo protetto con lo stesso nome, Value
, che restituisce un'istanza concreta 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
utilizza questo trucco per incrementare un contatore interno in modo che ogni valore sia individuale.
Se apri i documenti API Scala per Enumeration
e fai clic su Visibility: All
, vedrai comparire quel metodo.
Ho scritto una piccola panoramica su Enumerazione di scala e alternative, potresti trovarlo utile: pedrorijo.com/blog/scala-enums/ – pedrorijo91