2012-02-07 20 views
17

estoy aprendiendo Scala y no puede entender por qué:Tipo de retorno en la expresión Si

def signum(arg: Int) = { 
    if(arg > 0) 1 
    else if(arg < 0) -1 
    else 0 
} 

Ha Int como tipo de retorno signum (arg: Int): Int

Pero

def signum(arg: Int) = { 
    if(arg > 0) 1 
    else if(arg < 0) -1 
    else if(arg == 0) 0 
} 

tiene AnyValsignum (arg: Int): AnyVal

+0

(ciertamente no es fácil de búsqueda de texto completo para: http://stackoverflow.com/questions/4038741/why-does-this-scala-line-return-a -unit –

Respuesta

18

En ausencia de una explícita else, Scala asume esto:

else() 

Dónde () es el valor de Unit. Es el valor devuelto por println o asignación a var, por ejemplo.

Esto puede ser fácilmente verificado:

scala> val x = if (false) 1 
x: AnyVal =() 

scala> x.isInstanceOf[Unit] 
res3: Boolean = true 
23

Sucede porque en la segunda c si no ha especificado parte final else. En este caso, el tipo de devolución de esta rama faltante sería Unit. Por lo tanto, el compilador de Scala infiere AnyVal como padre común de Int y Unit.

se puede tratar de añadir el tipo de devolución explícita a la función de firma:

def signum(arg: Int): Int = ... 

No va a compilar con el error siguiente:

found : Unit 
required: Int 
    else if(arg == 0) 0 
     ^
one error found 

Así el compilador te dice que tipo de resultado de la última if es realmente Unit y no Int.

+9

Agregar una anotación de tipo a todos los miembros públicos es una muy buena idea. Primero evita errores como este. Y en segundo lugar es un tipo de documentación. En tercer lugar, algunas veces desea que se devuelva cierto tipo (general), pero el el compilador inferiría el más específico, por ejemplo, usted quiere _Seq_ en lugar de _List_. –

Cuestiones relacionadas