我不得不说我不理解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
类型
发布于 2012-06-17 06:21:24
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
,您将看到该方法出现。
https://stackoverflow.com/questions/11067396
复制相似问题