2016-04-04 29 views
1

這是用於檢查哪個容器包含標籤的Scala代碼。用於檢查表達式結果的匹配/大小寫不匹配Scala中的模式

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" 
} 

我可以通過匹配/大小寫還是類似的方法使其更好?我發現匹配/大小寫匹配不檢查表達式是否返回true的模式。所以,下面的代碼不起作用。

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

回答

1

你有很多重複對那裏發生的。我實際上嘗試使用模式匹配或if-else鏈作爲最後的手段。函數式編程在處理容器而不是語法結構時效果最好,因此我會通過將類型到字符串的映射放入Map來實現,如:

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

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

可以使用衛士

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

或者創建自定義unapply方法:

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