0

我可以在 Scala 中对部分函数的情况进行评估吗?

例如,给定

protected val eval: PartialFunction[(TestPrimitive, Seq[Literal]), Boolean] = {
    case (L3IntLt, Seq(IntLit(x), IntLit(y))) => x < y
    case (L3IntLe, Seq(IntLit(x), IntLit(y))) => x <= y
    case (L3IntGe, Seq(IntLit(x), IntLit(y))) => x >= y
    case (L3IntGt, Seq(IntLit(x), IntLit(y))) => x > y
    case (L3Eq, Seq(x, y)) => x == y
    case (L3Ne, Seq(x, y)) => x != y
  }

如果我可以假设按顺序评估案例,我可以将代码分解为:

protected val eval: PartialFunction[(TestPrimitive, Seq[Literal]), Boolean] = {
    case (L3Eq, Seq(x, y)) => x == y
    case (L3Ne, Seq(x, y)) => x != y
    case (arithp, Seq(IntLit(x), IntLit(y))) => arithp match{
      case L3IntLt => x < y
      case L3IntLe => x <= y
      case L3IntGe => x >= y
      case L3IntGt => x > y  
    }
  }

假设在评估案例时有顺序是一种好的编程习惯吗?

4

3 回答 3

3

Scala 编程(第一版)第 15 章中,您会发现:

匹配表达式是通过按写入顺序尝试每个模式来评估的。第一个匹配的模式被选中。. .

于 2017-04-12T22:32:38.973 回答
1

是的,案例从上到下进行评估,第一个匹配的获胜。这是一个很好的实践,因为它被 scala 程序员普遍理解,并且它是许多 scala 代码使用的非常常见的模式。

例如,对于非详尽匹配,通常指定一个 catch all:

x match {
  case "value1" => ...
  case "value2" => ...
  case other => ...
}

显然,这取决于顺序,因为如果包罗万象的情况是在开始时,它会捕获所有内容。

于 2017-04-12T22:26:55.277 回答
0

假设评估顺序是我们需要预先做的事情之一。我也会像你一样重构我的代码!

于 2017-04-12T22:24:58.310 回答