Scala匹配/比较枚举

时间:2010-05-05 14:42:18

标签: scala

我有一个枚举,我想在actor中的模式匹配中使用。我没有得到我期望的东西,现在,我怀疑我错过了一些简单的东西。

我的枚举,

object Ops extends Enumeration {
  val Create = Value("create")
  val Delete = Value("delete")
}

然后,我从String创建一个Ops:

val op = Ops.valueOf("create")

在我的比赛中,我有:

case (Ops.Create, ...)

但Ops.Create似乎不等于ops.valueOf(“create”)

前者只是一个原子'创造'而后者是一些(创造)

希望这足以告诉我我缺少的信息......

由于

3 个答案:

答案 0 :(得分:7)

如果您只是想获得Create的副本,那么您应该直接在代码中引用它:

val op = Ops.Create

但是如果你从字符串中解析它,那么字符串可能包含垃圾,所以valueOf会返回Option

val op1 = Ops.valueOf("create")  // Some(Ops.Create)
val op2 = Ops.valueOf("delete")  // Some(Ops.Delete)
val op3 = Ops.valueOf("aljeaw")  // None

现在,在您的比赛中,您可以随身携带Option[Ops.Value]并查找:

case(Some(Ops.Create),...)

并且你已经将垃圾内置的强大功能作为输入。

答案 1 :(得分:1)

Enumeration.valueOf会返回NoneSome,因为您可能会要求创建一个不存在的值。例如,在您的情况下,Ops.valueOf("blah")将返回None,因为您没有适当的枚举值。

说实话,在这种情况下,我会使用case classcase object代替Enumeration(它们提供更好的类型安全性)。

答案 2 :(得分:-1)

看起来我需要使用返回的Some的'get'方法来实际获得我想要的东西。 E.g。

ops.valueOf("create").get == Ops.Create

似乎既不直观也不友善,但它有效。