用于检查表达式结果的匹配/大小写与Scala中的模式不匹配

时间:2016-04-04 21:24:09

标签: scala match

这是用于检查哪个容器包含标签的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"
  ...

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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"