我可以假设在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
}
}
假设在评估案例时有一个订单,这是一个很好的编程习惯吗?
答案 0 :(得分:2)
在Programming in Scala(第一版),chapter 15,您会发现:
通过按照写入顺序尝试每个模式来评估匹配表达式。选择匹配的第一个模式。 。
答案 1 :(得分:1)
是的,案例从上到下进行评估,第一个用于匹配胜利。这是一个很好的实践,因为它通常被scala程序员理解,并且它是很多scala代码使用的非常常见的模式。
例如,对于非详尽的匹配,通常指定catch all:
x match {
case "value1" => ...
case "value2" => ...
case other => ...
}
显然,这取决于订单,因为如果所有案例都在开头,它就会抓住一切。
答案 2 :(得分:0)
假设评估顺序是我们需要提前完成的事情之一。而且我会像你一样对我的代码进行相同的重构!