如何访问scala类中的Enum对象

时间:2016-09-16 04:59:28

标签: scala enums

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

我的代码:

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
}

此代码编译,但它是丑陋的一面。

我想知道是否可以从类内部以更干净的方式访问Enum的值,例如没有“eNums.eNums”,我也很好奇如何访问值来自课外的enum。

编辑:我还想知道是否可以在默认构造函数中使用取值为eNums类型的值,例如,将(car:Celig.eNums)添加到类头中。

由于

1 个答案:

答案 0 :(得分:1)

以下内容是否符合您的要求?

final class Celig {
  object ENums extends Enumeration {
    val NAM, YEE = Value
  }

  def getNam: ENums.Value = ENums.NAM
}

我要提醒一点,Enumeration在Scala世界中通常不会被使用。我们经常使用sealed traitsealed abstract class来模拟包含Enumeration s的algebraic datatypes

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

sealed trait ENums
case object NAM extends ENums
case object YEE extends ENums

final class Celig {
  def getNam: ENums = NAM
}

这种做事方式对匹配语句的详尽检查形式提供了很好的编译器支持,并且允许比Enumeration提供的更丰富的层次结构。

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
  }
}

结果

[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

对于更复杂的层次结构,仍然享有编译器辅助的穷举检查

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