首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >理解scala枚举

理解scala枚举
EN

Stack Overflow用户
提问于 2012-06-17 06:06:06
回答 1查看 27.1K关注 0票数 124

我不得不说我不理解Scala枚举类。我可以复制粘贴文档中的示例,但我不知道发生了什么。

代码语言:javascript
复制
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

类型

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-17 06:21:24

Enumeration特征有一个类型成员Value,表示枚举的各个元素(它实际上是一个内部类,但这里的区别并不重要)。

因此,object WeekDay继承了该类型成员。行type WeekDay = Value只是一个类型别名。它很有用,因为在使用import WeekDay._将其导入其他位置后,您可以使用该类型,例如:

代码语言:javascript
复制
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)

取而代之的是,最小版本应该是:

代码语言:javascript
复制
object WeekDay extends Enumeration {
  val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}

而且您不必导入object WeekDay的内容,但是您需要使用WeekDay.Value类型来限定各个成员。所以这个例子就变成了

代码语言:javascript
复制
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使用此技巧来递增内部计数器,以便每个值都是独立的。

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

票数 152
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11067396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档