2012-02-27 17 views

Respuesta

46

implícito tipo Unit retorno:

def f() {println("ABC")} 

explícita tipo Unit retorno:

def g(): Unit = {println("ABC")} 

Tipo de retorno inferirse de la última expresión método, todavía Unit porque este es el tipo de println, pero confuso:

def h() = println("ABC") 

Todos los métodos anteriores son equivalentes. Preferiría f() porque la falta de operador = después de la firma del método solo es suficiente para mí. Use explícitamente : Unit cuando desee documentar extra el método. La última forma es confusa y en realidad se trata como una advertencia en .

El operador = es crucial. Si está presente, significa: "devuelva lo que devuelva la última declaración" en el cuerpo del método. Obviamente, no puede usar esta sintaxis para los métodos abstract. Si no es así, se supone Unit.

+0

Gracias Tomasz. El código que compartió provoca otra pregunta: ¿por qué se permite omitir el signo '=' en 'f' y' g'? – balteo

+2

Si su función devuelve 'Unidad', puede omitir el signo' = '. Cualquier función define sin un signo '=' devuelve 'Unidad' – Nicolas

+1

Porque en las funciones' Unidad' el '=' es opcional. Sin embargo, es obligatorio para todos los demás tipos, ya que realmente devuelven algo –

14

La sintaxis especial para los procedimientos (métodos que devuelven Unidad) fue un error. No lo uses Es confuso y peligroso para principiantes con un fondo Java/C (++). Y es un tratamiento especial innecesario. Utilice siempre el signo igual, con y sin la inferencia de tipos (este último sólo se debe utilizar para los miembros privados):

def foo(): Unit = someCodeReturningUnit() 

private def bar() = someCodeReturningUnit() 
+1

La [sección de la guía de estilo] (http://docs.scala-lang.org/style/types.html#void_methods) debe actualizarse si usted está justo sobre el "tratamiento especial innecesario". – agilesteel

+0

@agilesteel Siempre ha habido controversia sobre esa sección. –

+0

La guía de estilo [dice] (http://docs.scala-lang.org/style/declarations#procedure-syntax): "Evita la sintaxis del procedimiento, ya que tiende a ser confusa con muy poca ganancia en brevedad". –

6

La comunidad Scala está dividida al respecto. Por un lado, el hecho de no usar los tipos de devolución explícitos significa que puede olvidar fácilmente el signo =, lo que genera errores que a menudo son molestos de seguir. Por otro lado, Unit -retomando métodos que tienen una sintaxis diferente los pone en una categoría separada, lo que agrada a algunas personas.

Personalmente, preferiría que esta sintaxis desapareciera - los errores resultantes de la falta de =son molestos de rastrear. Pero ni siquiera está en desuso, así que preferiría aprovecharlo que sufrir los problemas de su existencia.

Por lo tanto, utilice lo que desee. Habrá gente que criticará su elección de cualquier manera, y la gente lo elogiará de cualquier manera.

Cuestiones relacionadas