Scala没有像Java那样的类型安全enum
。给定一组相关常量,在Scala中表示这些常量的最佳方式是什么?
发布于 2009-08-24 11:07:18
http://www.scala-lang.org/docu/files/api/scala/Enumeration.html
示例用法
object Main extends App {
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
WeekDay.values filter isWorkingDay foreach println
}
发布于 2009-08-24 13:45:42
声明命名枚举的一种不太冗长的方法:
object WeekDay extends Enumeration("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat") {
type WeekDay = Value
val Sun, Mon, Tue, Wed, Thu, Fri, Sat = Value
}
WeekDay.valueOf("Wed") // returns Some(Wed)
WeekDay.Fri.toString // returns Fri
当然,这里的问题是,您需要保持名称和val的顺序同步,如果name和val在同一行中声明,则更容易做到这一点。
发布于 2012-05-18 22:52:52
您可以使用密封的抽象类来代替枚举,例如:
sealed abstract class Constraint(val name: String, val verifier: Int => Boolean)
case object NotTooBig extends Constraint("NotTooBig", (_ < 1000))
case object NonZero extends Constraint("NonZero", (_ != 0))
case class NotEquals(x: Int) extends Constraint("NotEquals " + x, (_ != x))
object Main {
def eval(ctrs: Seq[Constraint])(x: Int): Boolean =
(true /: ctrs){ case (accum, ctr) => accum && ctr.verifier(x) }
def main(args: Array[String]) {
val ctrs = NotTooBig :: NotEquals(5) :: Nil
val evaluate = eval(ctrs) _
println(evaluate(3000))
println(evaluate(3))
println(evaluate(5))
}
}
https://stackoverflow.com/questions/1321745
复制相似问题