我不得不说我不懂Scala枚举类.我可以从文档中复制粘贴示例,但我不知道发生了什么.
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
Run Code Online (Sandbox Code Playgroud)
type WeekDay = Value,为什么我要写那个?val Mon = Value?那有什么意思?WeekDay
对象?和,val day = WeekDay.Mon,为什么是类型WeekDay.Value,而不是类型WeekDay?0__*_*0__ 149
该Enumeration特性有一个类型成员Value代表列举的各个元素(它实际上是一个内部类,但差异并不此处所).
因此object WeekDay继承了该类型成员.该行type WeekDay = Value只是一种类型别名.它很有用,因为在将其导入其他地方之后import WeekDay._,您可以使用该类型,例如:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Run Code Online (Sandbox Code Playgroud)
相反,最小版本只是:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
Run Code Online (Sandbox Code Playgroud)
你不必须输入的内容object WeekDay,但你需要使用类型WeekDay.Value和资格个人会员.所以这个例子就变成了
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
Run Code Online (Sandbox Code Playgroud)
第二个问题是关于的含义val Mon, ... = Value.如果你不研究实现,这确实很混乱Enumeration.这不是一种类型的赋值!这是不是调用一个受保护的同名方法,Value,它返回类型的具体实例Value.
恰巧,你可以写val a, b, c = foo在Scala中,并为每个值a,b以及c该方法foo会被一次又一次地叫.Enumeration使用此技巧增加内部计数器,以便每个值都是单独的.
如果您打开Scala API文档Enumeration并单击Visibility: All,您将看到该方法出现.