首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何对类型安全的枚举类型建模?

如何对类型安全的枚举类型建模?
EN

Stack Overflow用户
提问于 2009-08-24 11:06:01
回答 8查看 107K关注 0票数 315

Scala没有像Java那样的类型安全enum。给定一组相关常量,在Scala中表示这些常量的最佳方式是什么?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-08-24 11:07:18

http://www.scala-lang.org/docu/files/api/scala/Enumeration.html

示例用法

代码语言:javascript
复制
  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
  }
票数 189
EN

Stack Overflow用户

发布于 2009-08-24 13:45:42

声明命名枚举的一种不太冗长的方法:

代码语言:javascript
复制
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在同一行中声明,则更容易做到这一点。

票数 53
EN

Stack Overflow用户

发布于 2012-05-18 22:52:52

您可以使用密封的抽象类来代替枚举,例如:

代码语言:javascript
复制
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))
  }

}
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1321745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档