2012-06-16 28 views
120

Devo dire che non capisco le classi di enumerazione di Scala. Posso copiare e incollare l'esempio dalla documentazione, ma non ho idea di cosa sta succedendo.Comprendere le enumerazioni di scala

object WeekDay extends Enumeration { 
    type WeekDay = Value 
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value 
} 
import WeekDay._ 
  • Cosa significa type WeekDay = Value e perché devo scrivere che?
  • Perché val Mon = Value? Che cosa vuol dire, anche?
  • Perché devo importare l'oggetto ? E,
  • quando scrivo val day = WeekDay.Mon, perché è il tipo WeekDay.Value, non digitare WeekDay?
+2

Ho scritto una piccola panoramica su Enumerazione di scala e alternative, potresti trovarlo utile: pedrorijo.com/blog/scala-enums/ – pedrorijo91

risposta

149

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.

+2

Grazie, questo è molto confuso ma penso che sia giusto. Userò invece case classificate, sembra più semplice al 100%. –

+2

Personalmente preferisco anche le classi di casi sigillate. Un po 'più verboso, ma meno hokus-pokus con contatori interni mutabili e così via. Con Scala 2.10, ci sono alcune idee su come le enumerazioni (che a differenza di Java non sono un costrutto linguistico ma solo una soluzione di libreria) possono essere scritte meglio usando le macro. –

+0

@ 0__ Posso chiedere perché e come usi la classe sigillata per sostituire enum in Scala? C'è qualcosa di sbagliato nell'Enumerazione di Scala? – x1a0

Problemi correlati