我想知道从内部和外部访问类中的枚举的正确语法是什么。
我的代码:
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)添加到类头中。
由于
答案 0 :(得分:1)
以下内容是否符合您的要求?
final class Celig {
object ENums extends Enumeration {
val NAM, YEE = Value
}
def getNam: ENums.Value = ENums.NAM
}
我要提醒一点,Enumeration
在Scala世界中通常不会被使用。我们经常使用sealed trait
或sealed 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