2010-05-05 147 views
5

我有一个枚举,我想在模式匹配中使用的演员。我没有得到我期望的,现在,我怀疑我错过了一些简单的东西。斯卡拉匹配/比较枚举

我的枚举,

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

然后,我从一个字符串创建OPS:

val op = Ops.valueOf("create") 

在我的比赛,我有:

case (Ops.Create, ...) 

但Ops.Create没有按似乎不等于ops.valueOf(“创建”)

前者只是一个原子“创造”和后来的一些(创建)

我们希望,这是足够的信息有人告诉我,我错过了什么?

感谢

回答

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),...) 

而且您对垃圾作为输入具有内置健壮性。

+0

非常有帮助的回复,感谢雷克斯! – Tim 2010-05-05 16:31:02

+7

对于将来阅读此内容的人,“Enumeration.valueOf”已被弃用:改用'withName' – 2011-07-31 07:13:39

1

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

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

-1

它看起来像我需要使用返回的一些'get'方法来实际得到我想要的。例如。

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

似乎既不直观也不友好,但它的工作原理。

+0

这是因为'Enumeration.valueOf'返回一个'Option'对象,这意味着你必须使用'get'来获取值的值。 – mipadi 2010-05-05 18:33:47