我有一个枚举,我想在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”)
前者只是一个原子'创造'而后者是一些(创造)
希望这足以告诉我我缺少的信息......
由于
答案 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
会返回None
或Some
,因为您可能会要求创建一个不存在的值。例如,在您的情况下,Ops.valueOf("blah")
将返回None
,因为您没有适当的枚举值。
说实话,在这种情况下,我会使用case class或case object代替Enumeration
(它们提供更好的类型安全性)。
答案 2 :(得分:-1)
看起来我需要使用返回的Some的'get'方法来实际获得我想要的东西。 E.g。
ops.valueOf("create").get == Ops.Create
似乎既不直观也不友善,但它有效。