2010-05-05 102 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