124

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

1 回答 1

152

Enumerationtrait 有一个类型成员,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 = fooScala 编写,并且对于每个值a, bc该方法foo将被一次又一次地调用。Enumeration使用这个技巧来增加一个内部计数器,以便每个值都是单独的。

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

于 2012-06-16T22:21:23.757 回答