Hai tre (o giù di lì) opzioni per uscire dai loop.
Supponiamo di voler sommare i numeri fino a quando il totale è maggiore di 1000. Prova
var sum = 0
for (i <- 0 to 1000) sum += i
tranne che si desidera interrompere quando (somma> 1000).
Cosa fare? Esistono diverse opzioni.
(1a) Utilizzare un costrutto che include un condizionale testato.
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(attenzione - questo dipende dai dettagli di come il test takeWhile e il foreach sono interlacciati durante la valutazione e probabilmente non dovrebbero essere usati in pratica!).
(1b) Usa la ricorsione della coda invece di un ciclo for, approfittando di quanto sia facile scrivere un nuovo metodo in Scala:
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1c) Riporta all'utilizzo di un ciclo while
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(2) Genera un'eccezione.
object AllDone extends Exception { }
var sum = 0
try {
for (i <- 0 to 1000) { sum += i; if (sum>=1000) throw AllDone }
} catch {
case AllDone =>
}
(2a) In Scala 2.8+ questo è già preconfezionato scala.util.control.Breaks
nell'uso della sintassi che assomiglia molto alla tua vecchia pausa familiare da C / Java:
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(3) Inserisci il codice in un metodo e usa return.
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
Questo è intenzionalmente reso non troppo facile per almeno tre motivi a cui riesco a pensare. Innanzitutto, in blocchi di codice di grandi dimensioni, è facile trascurare le istruzioni "continue" e "break", o pensare che stai uscendo da più o meno di quello che sei realmente, o devi interrompere due loop che non puoi fare facilmente comunque - quindi l'uso standard, sebbene utile, ha i suoi problemi, e quindi dovresti provare a strutturare il tuo codice in un modo diverso. In secondo luogo, Scala ha molti tipi di annidamenti che probabilmente non noterai nemmeno, quindi se potessi uscire dalle cose, probabilmente rimarrai sorpreso da dove finiva il flusso del codice (specialmente con le chiusure). Terzo, la maggior parte dei "loop" di Scala non sono in realtà loop normali: sono chiamate di metodo che hanno il loro loop,looplike, è difficile trovare un modo coerente per sapere cosa dovrebbe fare "break" e simili. Quindi, per essere coerenti, la cosa più saggia da fare è non avere affatto una "pausa".
Nota : ci sono equivalenti funzionali di tutti questi in cui si restituisce il valore sum
piuttosto che mutarlo in posizione. Questi sono Scala più idiomatica. Tuttavia, la logica rimane la stessa. ( return
diventa return x
, ecc.).