了解scala枚举

Kar*_*lek 120 enums scala

我不得不说我不懂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,您将看到该方法出现.

  • 谢谢,这非常令人困惑,但我认为这是对的.我将使用密封的案例类,它似乎100%更容易. (2认同)
  • 我个人也喜欢密封的案例课程.有点冗长,但更少的hokus-pokus与可变内部计数器等等.使用Scala 2.10,有一些想法可以使用宏更好地编写枚举(不像Java不是语言构造而只是库解决方案). (2认同)