理解Scala枚举类型

7 浏览
0 Comments

理解Scala枚举类型

我必须承认我不理解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
admin 更改状态以发布 2023年5月23日
0
0 Comments

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使用这个技巧来增加内部计数器,以便每个值都是独立的。

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

0