2016-04-04 26 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