我不得不说我不懂Scala枚举类。我可以从文档中复制粘贴示例,但我不知道发生了什么。
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
type WeekDay = Value
是什么意思?我为什么要这样写? val Mon = Value
?这甚至意味着什么?WeekDay
宾语?和,val day = WeekDay.Mon
时,为什么键入WeekDay.Value
,而不是键入WeekDay
?答案 0 :(得分:149)
Enumeration
特征有一个类型成员Value
,表示枚举的各个元素(它实际上是一个内部类,但差别在这里无关紧要。)
因此object WeekDay
继承了该类型成员。行type WeekDay = Value
只是类别别名。这很有用,因为在使用import WeekDay._
将其导入其他地方后,您可以使用该类型,例如:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
相反,最小版本只是:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
并且您不必导入object WeekDay
的内容,但是您需要使用类型WeekDay.Value
并对个别成员进行限定。所以这个例子就会变成
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
第二个问题是关于val Mon, ... = Value
的含义。如果你不研究Enumeration
的实现,这确实很混乱。这不是一种类型的赋值!而是调用受保护的同名方法,Value
,它返回类型为Value
的具体实例。
您可以在Scala中编写val a, b, c = foo
,对于每个值a
,b
和c
,将调用方法foo
一次又一次。 Enumeration
使用此技巧增加内部计数器,以便每个值都是单独的。
如果您打开Enumeration
的Scala API文档并点击Visibility: All
,您会看到该方法出现。