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