Scala部分函数中的案例评估顺序

时间:2017-04-12 22:07:18

标签: scala partialfunction

我可以假设在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  
    }
  }

假设在评估案例时有一个订单,这是一个很好的编程习惯吗?

3 个答案:

答案 0 :(得分:2)

Programming in Scala(第一版),chapter 15,您会发现:

  

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

答案 1 :(得分:1)

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

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

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

显然,这取决于订单,因为如果所有案例都在开头,它就会抓住一切。

答案 2 :(得分:0)

假设评估顺序是我们需要提前完成的事情之一。而且我会像你一样对我的代码进行相同的重构!