Scala冗余模式匹配

时间:2014-02-03 08:43:28

标签: 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))
      val x = mapping.get(y) //Causes an error
      lookup(x) 
    else
      v
}

2 个答案:

答案 0 :(得分:3)

我认为mappingMap?如果是,请使用getOrElse

val x = mapping.getOrElse(y, v)

在第二个代码块中,您需要在if内的两个语句周围使用大括号。

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

  • 您有case y @ A(x),它为x分配了一个值。但是,紧接着,你有x=,这意味着你分配一个全新的x,遮蔽了旧的{.1}。
  • 同样,您有case y @ A(i),但不使用i
  • 两个match语句都没有多个case。如果匹配失败,这将导致运行时错误。但如果你知道它不会失败,那么这场比赛并不是真的有用。

答案 1 :(得分:2)

考虑

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