2016-04-04 8 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" 
} 

マッチ/ケースなどでさらにうまくできますか?私は一致/大文字と小文字が一致するのは、式が真を返すかどうかをチェックしないことです。したがって、次のコードは動作しません。

あなたが ガード使用することができます
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