Enumeration
trait 有一个类型成员,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
,但是您需要使用 typeWeekDay.Value
并限定单个成员。所以这个例子会变成
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
第二个问题是关于 的含义val Mon, ... = Value
。如果您不研究Enumeration
. 这不是类型的分配!相反,它调用了一个同名的受保护方法,Value
它返回一个类型的具体实例Value
。
碰巧你可以用val a, b, c = foo
Scala 编写,并且对于每个值a
, b
,c
该方法foo
将被一次又一次地调用。Enumeration
使用这个技巧来增加一个内部计数器,以便每个值都是单独的。
如果您打开 Scala API 文档Enumeration
并单击Visibility: All
,您将看到该方法出现。