2010-05-05 23 views
5

Bir oyuncudaki desen maçlarında kullanmak istediğim bir numaralandırma var. Beklediğim şeyi alamıyorum ve şimdi, basit bir şeyi kaçırdığımı sanmıyorum.Scala maçları/karşılaştırmaları karşılaştır

Benim numaralandırma, Sonra

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

, bir dize gelen bir Ops oluşturun:

case (Ops.Create, ...) 

Ama Ops.Create gelmez: my maç içinde

val op = Ops.valueOf("create") 

, var ops.valueOf'a eşit görünmüyor ("oluşturma")

eski sadece bir atom 'create' ve daha sonra bazı ...

Umarım, bu kimse ben eksik ne olduğunu söylemek için yeterli bilgi olduğu (oluştur)

Teşekkür olan

cevap

7

sadece Create bir kopyasını almak için çalışıyorsanız, o zaman doğrudan kodda bunun başvurmalıdır:

val op = Ops.Create 

Ama bir dize onu ayrıştırma eğer, dize önemsiz içerebilir, böylece valueOf bir Option verir:

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

Şimdi, maçta sadece Option[Ops.Value] boyunca taşımak ve bakabilirsiniz:

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

ve giriş olarak önemsiz yere yerleşik sağlamlık var.

+0

Gülünç yardımcı yanıt, teşekkürler Rex! – Tim

+7

Gelecekte bunu okuyan herkes için 'Enumeration.valueOf' kullanımdan kaldırıldı: yerine 'withName 'kullanın –

1

Enumeration.valueOf, None veya Some döndürür, çünkü varolmayan bir değer oluşturmanız istenebilir. Örneğin, uygun bir numaralandırma değeriniz olmadığından Ops.valueOf("blah")None döndürecektir.

Dürüst olmak gerekirse, bu durumda, bir Enumeration yerine case class veya case object kullanırdım (daha iyi bir tür güvenliği sağlarlar).

-1

İade edilen 'get' yöntemini kullanmak için ihtiyacım var gibi görünüyor. Örneğin.

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

Ne sezgisel ne de arkadaş canlısı görünüyor ama işe yarıyor.

+0

Çünkü, Enumeration.valueOf, bir 'Option' nesnesini döndürür; bu, değer değerini almak için' get 'kullanmanız gerektiği anlamına gelir. – mipadi