Scala枚举:选择一些值作为类型

Mah*_*hdi 1 types enumeration scala

考虑WeekDays枚举:

object WeekDay extends Enumeration {
    type WeekDay = Value
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
Run Code Online (Sandbox Code Playgroud)

现在我想定义一个只能在周末作为值的变量,例如:

val weekend: WeekDay.Sat | WeekDay.Sun
Run Code Online (Sandbox Code Playgroud)

但显然这不是正确的Scala语法.我有什么方法可以做或近似这个?

Jen*_*ens 5

只需用Google搜索"Scala枚举",然后点击第二个链接.简而言之,引用Martin Odersky的话说,枚举是指具有名称和顺序的简单整数常量.如果需要类型,则应使用案例类.因为周末也是工作日,所以听起来遗传是合适的:

sealed trait Weekday
sealed trait WorkDay extends Weekday
case object Monday extends WorkDay

sealed trait WeekendDay extends Weekday
case object Saturday extends WeekendDay
case object Sunday extends WeekendDay


object Main {     
    def onlyWeekendDays(d: WeekendDay) {
        println(d)
    }
    def allDays( d: Weekday ) {}

    def test() {
        onlyWeekendDays( Saturday );
        allDays( Saturday );
        allDays( Monday );
        // this fails to type-check: onlyWeekendDays( Monday );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您不需要使用关键字`new`来创建案例类 (3认同)
  • 应避免使用无参数案例类.您应该使用案例对象.我还建议将这个特性密封起来. (3认同)