¿Hay alguna razón real para proporcionar la declaración return
en Scala? (aparte de ser más "compatible con Java")¿Propósito de la declaración de "devolución" en Scala?
Respuesta
Ignorando las funciones anidadas, siempre es posible reemplazar los cálculos de Scala con devoluciones con cálculos equivalentes sin devoluciones. Este resultado se remonta a los primeros días de la "programación estructurada", y se llama structured program theorem, inteligentemente.
Con funciones anidadas, la situación cambia. Scala te permite colocar un "retorno" enterrado en el interior de una serie de funciones anidadas. Cuando se ejecuta la devolución, el control salta de todas las funciones anidadas, al método interno que lo contiene (suponiendo que el método todavía se está ejecutando, de lo contrario se lanza una excepción). Este tipo de desenrollado de la pila podría hacerse con excepciones, pero no se puede hacer mediante una reestructuración mecánica del cálculo (como es posible sin funciones anidadas).
La razón más común por la que realmente desea regresar desde el interior de una función anidada es salir de un bloque de control de recursos o de imperativo. (El cuerpo de un imperativo para la comprensión se traduce a una función anidada, a pesar de que se parece a una declaración.)
for(i<- 1 to bezillion; j <- i to bezillion+6){
if(expensiveCalculation(i, j)){
return otherExpensiveCalculation(i, j)
}
withExpensiveResource(urlForExpensiveResource){ resource =>
// do a bunch of stuff
if(done) return
//do a bunch of other stuff
if(reallyDoneThisTime) return
//final batch of stuff
}
Se proporciona con el fin de adaptarse a aquellas circunstancias en las que es difícil o engorroso organizar todas las rutas de flujo de control para que converjan en el extremo léxico del método.
Si bien es cierto, como dice Dave Griffith, que puede eliminar cualquier uso de return
, a menudo puede ser más ofuscante hacerlo que simplemente cortar la ejecución corta con un return
abierto.
Tenga en cuenta también que return
regresa de los métodos, no de las funciones (literales) que se pueden definir dentro de un método.
Sabía que esa era la respuesta. No puedo pensar en ningún ejemplo. – Jus12
Afortunadamente para mí, no solicitó ningún ejemplo ... –
+1 para ofuscantes –
que ver return
como útil al escribir código de estilo imperativo, lo que generalmente significa I/Código O Si está haciendo código funcional puro, no necesita (y no debe usar) return
. Pero con el código funcional puede necesitar holgazanería para obtener un rendimiento equivalente al código imperativo que puede "escapar antes" usando return
.
Aquí es un ejemplo
Este método tiene un montón de si-else para controlar el flujo, porque no hay retorno (eso es lo que me encontré con, usted puede utilizar su imaginación para ampliarla). Tomé esto de un ejemplo de la vida real y lo modificó para ser un código ficticio (de hecho, es más que esto):
Sin Retorno:
def process(request: Request[RawBuffer]): Result = {
if (condition1) {
error()
} else {
val condition2 = doSomethingElse()
if (!condition2) {
error()
} else {
val reply = doAnotherThing()
if (reply == null) {
Logger.warn("Receipt is null. Send bad request")
BadRequest("Coudln't receive receipt")
} else {
reply.hede = initializeHede()
if (reply.hede.isGood) {
success()
} else {
error()
}
}
}
}
}
y vuelta:
def process(request: Request[RawBuffer]): Result = {
if (condition1) {
return error()
}
val condition2 = doSomethingElse()
if (!condition2) {
return error()
}
val reply = doAnotherThing()
if (reply == null) {
Logger.warn("Receipt is null. Send bad request")
return BadRequest("Coudln't receive receipt")
}
reply.hede = initializeHede()
if (reply.hede.isGood)
return success()
return error()
}
En mi opinión, la segunda es más legible e incluso más manejable que la primera. La profundidad de la sangría (con código bien formateado) es profunda y profunda si no utiliza una declaración de retorno. Y no me gusta :)
Creo que los programadores de Scala bien entrenados (no yo) pueden seguir el primer fragmento con mayor claridad. – Jus12
De hecho, es un poco de "sabor", depende del punto de vista de los desarrolladores. p.ej. Me gusta el más plano – yerlilbilgin
- 1. Devolución en Scala
- 2. Declaración de devolución múltiple ¿EXTRAÑO?
- 3. Omitir declaración de devolución en C++
- 4. Comportamiento de la declaración de devolución en catch y finalmente
- 5. Comportamiento de la declaración de devolución en catch y finalmente
- 6. ¿Cuál es el propósito de la declaración directa?
- 7. DropDownListPara devolución de llamada o declaración if
- 8. Devolución e iteración de la colección con rendimiento en scala
- 9. Scala: Encuentre la declaración de DTD en un archivo
- 10. Declaración de devolución después de lanzar una excepción en C#
- 11. Scala: ¿puede deshacer la aplicación de varargs de devolución?
- 12. ¿declaración "con" equivalente para Scala?
- 13. ¿Cuál es el propósito de la devolución de llamada around_create en el modelo de Rails?
- 14. Devolución de un elemento de una lista en Scala
- 15. El compilador se queja de "declaración de devolución faltante" aunque es imposible alcanzar la condición donde falta la declaración de devolución
- 16. ¿Cuál es el propósito del lenguaje de programación Scala?
- 17. ¿Por qué inicio ilegal de declaración en Scala?
- 18. ¿Qué devuelve la función javascript en ausencia de una declaración de devolución?
- 19. ¿La declaración de devolución de Ruby no funciona con la palabra clave super?
- 20. Alcance de las variables dentro de la declaración de protección de la caja de scala
- 21. Scala: dos argumento implícito con la misma declaración
- 22. En Java, ¿cómo actúa un operador de incremento de inserción en una declaración de devolución?
- 23. ¿Envolviendo el método de devolución nula en Java con la opción en Scala?
- 24. ¿Cuál es el propósito del paquete Scala scala.util.automata?
- 25. Propósito de la propiedad mediaPlaybackAllowsAirPlay en UIWebView
- 26. Propósito de los singletons en la programación
- 27. ¿Es la declaración de devolución multivalor del lenguaje "Go" de Google una alternativa a las excepciones?
- 28. Código después de una declaración de devolución en una función de PHP
- 29. ¿Cuál es el propósito de las asignaciones de tipo en Scala?
- 30. Suprimir los tipos de devolución en la consola sbt/Scala REPL
Gracias por la respuesta.Esto es muy informativo – Jus12
Creo que esta es una respuesta más formal. Estoy interesado en la prueba del resultado que mencionas. ¿Puedes proporcionar algunas referencias? – Jus12
Se agregó un enlace a wikipedia para el teorema del programa estructurado. –