了解scala枚举

时间:2012-06-16 22:06:06

标签: scala enums

我不得不说我不懂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

1 个答案:

答案 0 :(得分:149)

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,对于每个值abc,将调用方法foo一次又一次。 Enumeration使用此技巧增加内部计数器,以便每个值都是单独的。

如果您打开Enumeration的Scala API文档并点击Visibility: All,您会看到该方法出现。