了解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 WeekDayinheritance该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的受保护方法,该方法返回Valuetypes的具体实例。

恰巧你可以在Scala中写入val a, b, c = foo ,并且对于每个值abcfoo方法都会被一次又一次地调用。 Enumeration使用这个技巧来增加一个内部计数器,使每个值都是单独的。

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