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
}
你不必导入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
利用这个技巧来增加内部计数器,以便使每个值都是唯一的。
如果打开 Scala API 文档中的
Enumeration
并单击
Visibility: All
,您将看到该方法的出现。