Tienes tres (más o menos) opciones para salir de los bucles.
Suponga que desea sumar números hasta que el total sea mayor que 1000. Intenta
var sum = 0
for (i <- 0 to 1000) sum += i
excepto que quieres parar cuando (suma> 1000).
¿Qué hacer? Hay varias opciones
(1a) Use alguna construcción que incluya un condicional que pruebe.
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(advertencia: esto depende de los detalles de cómo se intercalan la prueba takeWhile y el foreach durante la evaluación, ¡y probablemente no deberían usarse en la práctica!).
(1b) Use la recursión de cola en lugar de un bucle for, aprovechando lo fácil que es escribir un nuevo método en Scala:
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1c) Vuelva a utilizar un bucle while
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(2) Lanzar una excepción.
object AllDone extends Exception { }
var sum = 0
try {
for (i <- 0 to 1000) { sum += i; if (sum>=1000) throw AllDone }
} catch {
case AllDone =>
}
(2a) En Scala 2.8+, esto ya está preempaquetado en el scala.util.control.Breaks
uso de sintaxis que se parece mucho a su antiguo descanso familiar de C / Java:
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(3) Ponga el código en un método y use return.
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
Esto se hace intencionalmente no demasiado fácil por al menos tres razones en las que puedo pensar. Primero, en bloques de código grandes, es fácil pasar por alto las declaraciones de "continuar" y "romper", o pensar que estás saliendo de más o menos de lo que realmente eres, o que necesitas romper dos bucles que no puedes hacer de todos modos fácilmente, por lo que el uso estándar, aunque práctico, tiene sus problemas y, por lo tanto, debe intentar estructurar su código de una manera diferente. En segundo lugar, Scala tiene todo tipo de anidamientos que probablemente ni siquiera note, por lo que si pudiera salir de las cosas, probablemente se sorprendería de dónde terminó el flujo del código (especialmente con los cierres). Tercero, la mayoría de los "bucles" de Scala no son en realidad bucles normales: son llamadas a métodos que tienen su propio bucle,como un bucle, es difícil encontrar una manera consistente de saber qué debe hacer "break" y cosas similares. Entonces, para ser consistente, lo más sabio es no tener un "descanso" en absoluto.
Nota : Hay equivalentes funcionales de todos estos en los que devuelve el valor en sum
lugar de mutarlo en su lugar. Estos son Scala más idiomáticos. Sin embargo, la lógica sigue siendo la misma. (se return
convierte return x
, etc.).