2016-04-04 16 views
1

Bu, hangi kapsayıcının etiketi içerdiğini kontrol etmek için Scala kodudur.İfade sonuçlarını denetlemek için eşleşme/durum Scala'daki desen eşleşmiyor

var typeName:JString = "" 
if (stringTypes.contains(label)) { 
    typeName = "string" 
} else if (floatingTypes.contains(label)) { 
    typeName = "float" 
} else if (encodingTypes.contains(label)) { 
    typeName = "encoding" 
} else if (rangeTypes.contains(label)) { 
    typeName = "range" 
} 

Maç/kasa veya benzerleriyle daha iyi yapabilir miyim? Görüntünün true olup olmadığını kontrol etmediği desen/davanın eşleşmediğini görüyorum. Yani, aşağıdaki kod çalışmıyor.

val typeName = label match { 
    case rangeTypes.contains(label) => "range" 
    ... 

cevap

1

Oraya oluyor tekrarı çok şey var. Aslında desen eşleştirmeyi veya if-else zincirlerini son çare olarak kullanmayı deniyorum. İşlevsel programlama, sözdizimsel yapılar yerine kapsayıcılar üzerinde çalışırken en iyi şekilde çalışır, bu yüzden tür-dize eşlemesini Map, örneğin:

val types = Map(stringTypes -> "string", 
       floatingTypes -> "float", 
       encodingTypes -> "encoding", 
       rangeTypes -> "range") 

types find (_._1 contains label) map (_._2) getOrElse "label not found" 
2

Eğer korumaları kullanabilirsiniz:

val typeName = label match { 
    case label if rangeTypes.contains(label) => "range" 
    ... 

veya özel unapply yöntemi oluşturun:

object TypeName { 
    def unapply(label: String): Option[String] = 
    if (rangeTypes.contains(label)) Some("range") 
    else if(floatingTypes.contains(label)) Some("float") 
    ... else Some("") // this means that you won't have a MatchError but an empty string if nothing matches 
} 

val TypeName(typeName) = label 
İlgili konular