Scala no tiene break
o continue
, por lo que algunos comportamientos en bucle requieren un poco más de pensamiento.
Terminar un ciclo temprano requiere recursión de cola, excepciones o scala.util.control.Breaks
(que usa excepciones).
La razón de esto es que, como goto
, son construcciones de flujo que oscurecen el flujo, y se pueden lograr de maneras mejores y menos sorprendentes.
Pero parece que esos mismos argumentos podrían usarse return
.
¿Por qué Scala omitió deliberadamente break
y continue
, pero no return
?
language-design
scala
control-structures
Paul Draper
fuente
fuente
break
ycontinue
necesito maquinaria de limpieza adicional. OTOHreturn
es una forma de terminar una función de manera ordenada, y cualquier maquinaria de limpieza ya está allí de todos modos.breakable { for { break; } }
más que una idea de último momento, y probablemente lejos de ser eficiente.break
ycontinue
está contenida en su pregunta y en el enlace de su pregunta. La pregunta parareturn
es exactamente de qué se trataba la pregunta que vinculé, y fue respondida, al menos en la respuesta aceptada y más votada. Si las dos respuestas juntas no responden a su pregunta, tal vez podría editar la pregunta para aclararla.Respuestas:
Romper y continuar:
En una charla sobre Scala , Martin Odersky dio 3 razones para no incluir el descanso o continuar en la diapositiva 22:
Y luego dice: "Podemos apoyarlos únicamente en las bibliotecas". En la diapositiva 23, da un código que implementa
break
. Aunque no conozco a Scala lo suficientemente bien como para estar seguro, parece que el fragmento corto en esa diapositiva es todo lo que se necesita para implementarbreak
, y esocontinue
podría implementarse en un código que es igualmente corto.Poder implementar cosas como esta en las bibliotecas simplifica el lenguaje central.
En 'Programación en Scala, segunda edición', de Martin Odersky, Lex Spoon y Bill Venners, se brinda la siguiente explicación:
Regreso:
Los retornos podrían considerarse un poco imperativos en el estilo, ya que el retorno es un verbo, un comando para hacer algo. Pero también se pueden ver de una manera puramente funcional / declarativa: definen cuál es el valor de retorno de la función (incluso si, en una función con múltiples retornos, solo cada uno da una definición parcial).
En el mismo libro, dicen lo siguiente sobre
return
:Los métodos finalizan y devuelven un valor, incluso si
return
no se usa una declaración, por lo que no puede haber problemas con los cierres, ya que de lo contrario los cierres no funcionarían.Tampoco puede haber problemas para combinar bien con los literales de función, ya que la función tiene que devolver un valor de todos modos.
fuente
Creo que las respuestas anteriores hacen justicia a los problemas de definir la semántica para
break
ocontinue
para Scala en todo el lenguaje para Scala, con contextos relativamente sin restricciones.Escribí una pequeña biblioteca que define
break
ycontinue
en un contexto más restringido: iteración sobre secuencias a través de Scala para comprensiones. Al centrarme en ese contexto, creo que la semántica se vuelve inequívoca y fácil de razonar.La biblioteca está disponible aquí: https://github.com/erikerlandson/breakable
Aquí hay un ejemplo simple de cómo se ve en el código:
fuente