【问题标题】:Match/case for checking the expression results not matching pattern in Scala用于检查表达式结果与 Scala 中的模式不匹配的匹配/案例
【发布时间】:2016-04-05 06:12:32
【问题描述】:

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

我可以用 match/case 或类似的东西做得更好吗?我看到匹配/大小写与不检查表达式是否返回 true 的模式匹配。因此,以下代码不起作用。

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

【问题讨论】:

    标签: scala match


    【解决方案1】:

    你可以使用守卫

    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 
    

    【讨论】:

      【解决方案2】:

      那里有很多重复。我实际上尝试使用模式匹配或 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"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-12
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 2015-04-27
        相关资源
        最近更新 更多