Scala冗余模式匹配

Scala冗余模式匹配,scala,pattern-matching,Scala,Pattern Matching,如何使此代码段更高效 v match { case y @ A(x) => val x = if (mapping.contains(y)) mapping.get(y) else v x match { case y @ A(i) => lookup(y) } } 我觉得通过声明一个val来检索mapping.get(y),两个模式匹配器的使用可能会减少到一个,但每次我尝试这样做时,都会出现一

如何使此代码段更高效

v match {
  case y @ A(x) =>
    val x = if (mapping.contains(y))
      mapping.get(y)
    else
      v
    x match {
      case y @ A(i) =>
        lookup(y)
    }
}
我觉得通过声明一个val来检索mapping.get(y),两个模式匹配器的使用可能会减少到一个,但每次我尝试这样做时,都会出现一个非法的简单表达式错误:

v match {
  case y @ A(x) =>
    val x = if (mapping.contains(y))
      val x = mapping.get(y) //Causes an error
      lookup(x) 
    else
      v
}

我假设
映射
是一个
映射
?如果是,请使用
getOrElse

val x = mapping.getOrElse(y, v)
在第二个代码块中,需要在
if
中的两条语句周围加上大括号

但是你的代码没有多大意义。有几个原因:

  • 您有
    case y@A(x)
    ,它为
    x
    赋值。但是,紧接着,您就有了
    x=
    ,这意味着您分配了一个全新的
    x
    ,与旧的
    x相去甚远
  • 类似地,您有
    case y@A(i)
    ,但不使用
    i
  • match
    语句都没有多个
    大小写
    。如果匹配失败,这将导致运行时错误。但是如果你知道它不会失败,那么这场比赛就没有什么用处了
我假设
映射
是一个
映射
?如果是,请使用
getOrElse

val x = mapping.getOrElse(y, v)
在第二个代码块中,需要在
if
中的两条语句周围加上大括号

但是你的代码没有多大意义。有几个原因:

  • 您有
    case y@A(x)
    ,它为
    x
    赋值。但是,紧接着,您就有了
    x=
    ,这意味着您分配了一个全新的
    x
    ,与旧的
    x相去甚远
  • 类似地,您有
    case y@A(i)
    ,但不使用
    i
  • match
    语句都没有多个
    大小写
    。如果匹配失败,这将导致运行时错误。但是如果你知道它不会失败,那么这场比赛就没有什么用处了
      考虑

      mapping.getOrElse(y,v) match {
        case z @ A(i) => lookup(z)
        case _        => somethingElse
      }
      
      考虑

      mapping.getOrElse(y,v) match {
        case z @ A(i) => lookup(z)
        case _        => somethingElse
      }
      

      请注意@dhg对查询代码的指导性意见。请注意@dhg对查询代码的指导性意见。