Vous avez trois (ou plus) options pour sortir des boucles.
Supposons que vous souhaitiez additionner des nombres jusqu'à ce que le total soit supérieur à 1000. Vous essayez
var sum = 0
for (i <- 0 to 1000) sum += i
sauf que vous voulez arrêter quand (somme> 1000).
Que faire? Il existe plusieurs options.
(1a) Utilisez une construction qui inclut un conditionnel que vous testez.
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(avertissement - cela dépend des détails de la façon dont le test takeWhile et le foreach sont entrelacés pendant l'évaluation, et ne devraient probablement pas être utilisés dans la pratique!).
(1b) Utilisez la récursion de queue au lieu d'une boucle for, en profitant de la facilité d'écriture d'une nouvelle méthode dans Scala:
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1c) Revenez à l'utilisation d'une boucle while
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(2) Jetez une exception.
object AllDone extends Exception { }
var sum = 0
try {
for (i <- 0 to 1000) { sum += i; if (sum>=1000) throw AllDone }
} catch {
case AllDone =>
}
(2a) Dans Scala 2.8+, ceci est déjà pré-packagé en scala.util.control.Breaks
utilisant une syntaxe qui ressemble beaucoup à votre ancienne rupture familière de C / Java:
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(3) Mettez le code dans une méthode et utilisez return.
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
C'est intentionnellement rendu pas trop facile pour au moins trois raisons auxquelles je peux penser. Tout d'abord, dans les grands blocs de code, il est facile d'ignorer les instructions "continue" et "break", ou de penser que vous vous échappez de plus ou de moins que vous ne l'êtes réellement, ou d'avoir besoin de casser deux boucles que vous ne pouvez pas faire facilement de toute façon - donc l'utilisation standard, bien que pratique, a ses problèmes, et donc vous devriez essayer de structurer votre code d'une manière différente. Deuxièmement, Scala a toutes sortes d'imbrications que vous ne remarquerez probablement même pas, donc si vous pouviez vous échapper, vous seriez probablement surpris de la fin du flux de code (en particulier avec les fermetures). Troisièmement, la plupart des "boucles" de Scala ne sont pas en fait des boucles normales - ce sont des appels de méthode qui ont leur propre boucle,Looplike, il est difficile de trouver un moyen cohérent de savoir ce que la «rupture» et autres devraient faire. Donc, pour être cohérent, la chose la plus sage à faire est de ne pas avoir du tout de "pause".
Remarque : il existe des équivalents fonctionnels de tous ces éléments dans lesquels vous retournez la valeur de sum
plutôt que de la muter en place. Ce sont des Scala plus idiomatiques. Cependant, la logique reste la même. ( return
devient return x
, etc.).