理解Scala枚举

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (16)

我不理解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?
提问于
用户回答回答于

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

碰巧你能写val a, b, c = foo在Scala中,对于每个值ab,和c方法foo会被一次又一次的召唤。Enumeration使用此技巧可以增加内部计数器,使每个值都是单独的。

如果您打开ScalaAPI文档Enumeration然后点击Visibility: All,你会看到这个方法出现。

扫码关注云+社区