2012-09-08 11 views
21

A veces veo trozos de código Scala, con varios niveles anidados de condicionales y apareamientos, que serían mucho más claros utilizando un retorno explícito para salir de la función.Hay alguna razón para evitar declaraciones de devolución

¿Hay algún beneficio en evitar esas declaraciones explícitas de devolución?

+0

aquí está una publicación de blog relacionada en [return] (https://tpolecat.github.io/2014/05/09/return.html) – BlueSky

Respuesta

17

A returnpuede ser implementado por lanzar una excepción, por lo que puede tener una cierta sobrecarga sobre la forma estándar de declarar el resultado de un método. (Gracias por Kim Stebel por señalar que esto no es siempre, tal vez ni siquiera a menudo, el caso.)

Además, un return en un cierre volverá a partir del método en el que se define el cierre, y no simplemente desde el cierre en sí. Eso hace que sea útil para eso, e inútil para devolver un resultado de cierres.

Un ejemplo de lo anterior:

def find[T](seq: Seq[T], predicate: T => Boolean): Option[T] = { 
    seq foreach { elem => 
    if (predicate(elem)) return Some(elem) // returns from find 
    } 
    None 
} 

Si todavía no entiende, elem => if (predicate(elem)) return Some(elem) es el método apply de un objeto anónimo del que implementa Function1 y se pasa a foreach como parámetro. Elimine return de él, y no funcionará.

+0

La devolución no siempre se implementa mediante excepciones. Simplemente compile un ciclo while simple con una declaración de retorno y mire la salida con javap -v. De hecho, me gustaría ver algún ejemplo donde el retorno _es_ implementado de esa manera. –

+0

@KimStebel Interesante, no sabía que Scala optimizó ese caso. Como ejemplo, solo mira el código en mi respuesta. –

+0

Estoy seguro de que entiende a qué se refiere cuando dice que una devolución de un remate volverá del método en el que está definido, y no de la clausura itsefl. Ya me he quemado con eso, como explicaste aquí http://stackoverflow.com/questions/11929485/scala-problems-with-return-statement – opensas

2

Una desventaja es que no se puede inferir el tipo de devolución. Todo lo demás es una cuestión de estilo. Lo que parece confuso o poco claro para usted puede ser perfectamente "natural" para otra persona.

2

Una devolución explícita rompe el flujo de control. Por ejemplo, si usted tiene una declaración como

if(isAuth(user)) { 
return getProfile(user) 
} 
else { 
return None 
} 

la estructura de control (si) no está terminado, que es la razón por la que argumentan que es más confuso. Para mí, esto es análogo a una declaración de interrupción. Además Scalas 'todo es un valor' principio reduce la necesidad de utilizar los rendimientos explícitos que conduce a menos gente usando una palabra clave que es sólo útil para los estados def:

// start 
def someString:String = return "somestring" 

// def without return 
def someString = "somestring" 

// after refactoring 
val someString = "somestring"  

ves que el tipo de anotación tiene que ser añadido y cuando se cambia la def a un valor val, se requiere eliminar la devolución.

Cuestiones relacionadas