Sie haben drei (oder so) Optionen, um aus Schleifen auszubrechen.
Angenommen, Sie möchten Zahlen summieren, bis die Summe größer als 1000 ist. Sie versuchen es
var sum = 0
for (i <- 0 to 1000) sum += i
außer Sie möchten aufhören, wenn (Summe> 1000).
Was ist zu tun? Es gibt mehrere Möglichkeiten.
(1a) Verwenden Sie ein Konstrukt, das eine von Ihnen getestete Bedingung enthält.
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(Warnung - dies hängt von Details ab, wie der takeWhile-Test und der foreach während der Auswertung verschachtelt sind, und sollte in der Praxis wahrscheinlich nicht verwendet werden!).
(1b) Verwenden Sie die Schwanzrekursion anstelle einer for-Schleife, um zu nutzen, wie einfach es ist, eine neue Methode in Scala zu schreiben:
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1c) Verwenden Sie eine while-Schleife
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(2) Eine Ausnahme auslösen.
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+ ist dies bereits in einer scala.util.control.Breaks
Syntax vorgepackt, die Ihrer bekannten alten Pause von C / Java sehr ähnlich sieht:
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(3) Fügen Sie den Code in eine Methode ein und verwenden Sie return.
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
Dies wird absichtlich aus mindestens drei Gründen, die mir einfallen, nicht allzu einfach gemacht. Erstens ist es in großen Codeblöcken leicht, die Anweisungen "continue" und "break" zu übersehen oder zu glauben, dass Sie mehr oder weniger ausbrechen, als Sie wirklich sind, oder zwei Schleifen brechen müssen, was Sie nicht können sowieso einfach - so hat die Standardverwendung, obwohl sie praktisch ist, ihre Probleme, und deshalb sollten Sie versuchen, Ihren Code anders zu strukturieren. Zweitens hat Scala alle Arten von Verschachtelungen, die Sie wahrscheinlich gar nicht bemerken. Wenn Sie also aus den Dingen ausbrechen könnten, wären Sie wahrscheinlich überrascht, wo der Codefluss endete (insbesondere bei Schließungen). Drittens sind die meisten "Schleifen" von Scala keine normalen Schleifen - es handelt sich um Methodenaufrufe mit einer eigenen Schleife.Schleifenartig ist es schwierig, einen konsistenten Weg zu finden, um zu wissen, was "Pause" und dergleichen tun sollten. Um konsequent zu sein, ist es klüger, überhaupt keine "Pause" zu machen.
Hinweis : Es gibt funktionale Äquivalente von all diesen, bei denen Sie den Wert von zurückgeben, sum
anstatt ihn an Ort und Stelle zu mutieren. Dies sind eher idiomatische Scala. Die Logik bleibt jedoch gleich. ( return
wird return x
usw.).