2017-04-12 4 views
0

Puis-je supposer un ordre sur l'évaluation des cas d'une fonction partielle dans Scala?Ordre d'évaluation des cas dans la fonction partielle Scala

Ainsi, par exemple, étant donné

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 
    } 

Si je pouvais supposer que les cas sont évalués afin que je peux le facteur le code comme:

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

Est-ce une bonne pratique de programmation de supposer qu'il ya un ordre dans l'évaluation des cas?

Répondre

2

Dans Programming in Scala (première édition), chapter 15, vous trouverez:

Une expression de correspondance est évaluée en essayant chacun des motifs dans l'ordre dans lequel ils sont écrits. Le premier motif correspondant est sélectionné. . .

0

En supposant que l'ordre de l'évaluation est l'une des choses que nous devons faire de toute façon de toute façon .. Aussi, je ferais le même refactor mon code comme vous l'avez fait!

1

Oui, les cas sont évalués de haut en bas, le premier correspondant aux victoires. C'est une bonne pratique car il est généralement compris par les programmeurs scala, et c'est un modèle très commun utilisé par beaucoup de code scala.

Par exemple, pour les matches non-exhaustive, il est courant de spécifier un fourre-tout:

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

Il est clair que cela dépend de l'ordre, car si le fourre-tout cas était au début, il serait attrape tout.