如何访问scala类中的Enum对象

How to access an Enum object inside a scala class

我想知道从类内部和外部访问枚举的正确语法是什么。

我的代码:

1
2
3
4
5
6
7
8
9
10
11
final class Celig {

  object eNums extends Enumeration {
    type eNums = Value
    val NAM, YEE = Value
  }

  // Here I'd like to assign a method that always returns a specific enum value
  var nammy = eNums.NAM
  def getNam: eNums.eNums = nammy
}

这段代码是编译的,但它有一个丑陋的一面。

我想知道枚举值是否可以从类内部以更干净的方式访问,例如不使用"enums.enums",我还想知道如何从类外部访问枚举值。

edit:我还想知道是否可以在默认构造函数中使用一个值,该值采用枚举类型,例如,向类头添加(car:celig.enums)。

谢谢


像下面这样的东西能满足你的需求吗?

1
2
3
4
5
6
7
final class Celig {
  object ENums extends Enumeration {
    val NAM, YEE = Value
  }

  def getNam: ENums.Value = ENums.NAM
}

我要注意的是,在斯卡拉的世界里,Enumeration通常不怎么常用。通常我们使用sealed traits或sealed abstract classes来模拟包含Enumerations的代数数据类型。

特别是,我可能会重写您的代码,如下所示:

1
2
3
4
5
6
7
sealed trait ENums
case object NAM extends ENums
case object YEE extends ENums

final class Celig {
  def getNam: ENums = NAM
}

这种方式有很好的编译器支持,可以对match语句进行详尽的检查,并且允许比Enumeration提供的层次结构更丰富。

1
2
3
4
5
6
7
8
9
sealed trait ENums
case object NAM extends ENums
case object YEE extends ENums

final class Celig {
  def switchOnEnums(x: ENums): Int = x match {
    case NAM => 1
  }
}

结果

1
2
3
4
5
6
7
8
[info] Set current project to Test 1 (in build file:/scalastuff/)
[info] Compiling 1 Scala source to /scalastuff/target/scala-2.11/classes...
[warn] /scalastuff/src/main/scala/Main.scala:35: match may not be exhaustive.
[warn] It would fail on the following input: YEE
[warn]   def switchOnEnums(x: ENums): Int = x match {
[warn]                                      ^
[warn] one warning found
[success] Total time: 5 s, completed Sep 16, 2016 1:13:35 AM

对于一个更复杂的层次结构,它仍然享受着以前的编译器辅助的详尽性检查。

1
2
3
4
5
6
7
8
9
10
11
12
13
sealed trait Day
case object Monday extends Day
case object Tuesday extends Day
// Got tired of writing days...

sealed trait Month
case object January extends Month
case object February extends Month
// Got tired of writing months...

sealed trait Date
case class CalendarFormat(day: Day, month: Month, year: Int) extends Date
case class UnixTime(sinceUTC: BigInt) extends Date