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