理解Scala枚举类型
理解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日
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
,对于每个值a
,b
和c
,方法foo
将一次又一次地被调用。Enumeration
使用这个技巧来增加内部计数器,以便每个值都是独立的。
如果您打开Scala API文档的Enumeration
,并单击Visibility: All
,您将看到该方法出现。