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

Scala Enumeration: Choose some values as type

考虑 WeekDays 枚举:

object WeekDay extends Enumeration {
    type WeekDay = Value
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}

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

val weekend: WeekDay.Sat | WeekDay.Sun

但显然这不是正确的 Scala 语法。有什么办法可以做到或近似吗?

刚刚用谷歌搜索 "Scala enumerations",然后点击了 second link。简而言之,这引用了 Martin Odersky 的话,他说枚举是具有名称和顺序的简单整数常量。如果你想要类型,你应该使用 case 类。由于周末也是工作日,因此继承似乎是合适的:

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