2017-04-12 57 views
0

我可以假设斯卡拉部分功能的案例评估顺序?斯卡拉部分功能的案例评估顺序

因此,举例来说,由于

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 
    } 
    } 

它是一个良好的编程习惯假设有评估案件的命令?

回答

2

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

匹配表达式是由试图在它们的排列顺序每个模式的评价。匹配的第一个模式被选中。 。 。

0

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

1

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

例如,对于非穷尽的比赛,是很常见的指定包罗万象:

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

显然,这是依赖于顺序,因为如果包罗万象的情况下,在开始的时候,它会抓住一切。