了解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
,而不是typesWeekDay
?
Enumeration
特征有一个types成员Value
表示枚举的个别元素(它实际上是一个内部类,但差异并不重要)。
因此, object WeekDay
inheritance该types成员。 行type WeekDay = Value
只是一个types别名 。 这很有用,因为在import WeekDay._
,您可以使用该types,例如:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
相反,最小版本只是:
object WeekDay extends Enumeration { val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value }
而且您不必导入object WeekDay
的内容,但是您需要使用typesWeekDay.Value
并限定各个成员。 所以这个例子会变成
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
第二个问题是关于val Mon, ... = Value
的意义val Mon, ... = Value
。 如果不考虑Enumeration
的实现,这确实是非常混乱的。 这不是一个types的任务! 而是调用一个名为 Value
的受保护方法,该方法返回Value
types的具体实例。
恰巧你可以在Scala中写入val a, b, c = foo
,并且对于每个值a
, b
和c
, foo
方法都会被一次又一次地调用。 Enumeration
使用这个技巧来增加一个内部计数器,使每个值都是单独的。
如果您打开Enumeration
的Scala API文档,然后单击Visibility: All
,您将看到该方法出现。