2011-04-30 13 views
9

en Scala, cuando uso el asegurar PREDEF, que sólo funcionan en la demás parte de una expresión else if-:¿Por qué asegurar el trabajo solo en otra cosa?

def evenIt(x:Int) = { 
    if(x % 2 == 0) 
      x+1 //return odd on purpose! 
    else{ 
     x + 1 
    } ensuring(_ % 2 == 0) 
} 

//Test it: 
evenIt(3) 
> 4 
evenIt(4) 
> 5 //<--- ensuring does not catch this! 

pero pensé que "if-else" era una expresión en scala. Por lo tanto, solo debe devolver un valor, que a su vez debe pasarse a para garantizar?

¿O estoy confundiendo algo aquí? Gracias.

EDIT: En la programación Scala libro en el autor utiliza de la siguiente manera:

private def widen(x: Int) : Element = 
    if(w <= width) 
     this 
    else { 
     val left = elem(' ', (w - width)/2, height) 
     var right = elem(' ', w - width - left.width, height) 
     left beside this beside right 
    } ensuring (w <= _.width 

¿Él se aplican sólo a una parte más aquí?

Respuesta

17

Sí, if-else es una expresión, pero por la forma en que lo puso entre corchetes, solo aplicará ensuring a x+1, no a if -expression. Si ponemos la ensuring después de la llave de cierre que rodea el if, que va a hacer lo que quiere:

def evenIt(x:Int) = { 
    if(x % 2 == 0) 
     x + 1 //return odd on purpose! 
    else 
     x + 1 
} ensuring(_ % 2 == 0) 
+1

Gracias! No he pensado en eso. Agregué el código del libro, donde el autor usa esta función. ¿Lo aplica a la parte else allí? – drozzy

+1

Acabo de tropezar con el mismo problema) Creo que sí, en el libro se aplica solo para otra cosa, porque la ampliación solo se hace en la parte else. Pero podemos poner diferentes garantías en diferentes partes del código – damluar

Cuestiones relacionadas