ループから抜け出すには、3つ(またはそれ以上)のオプションがあります。
合計が1000を超えるまで数値を合計するとします。
var sum = 0
for (i <- 0 to 1000) sum += i
停止したい場合を除いて(合計> 1000)。
何をすべきか?いくつかのオプションがあります。
(1a)テストする条件を含む構造を使用します。
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(警告-これは、takeWhileテストとforeachが評価中にどのようにインターリーブされるかによって異なり、実際には使用しないでください!)
(1b)forループの代わりに末尾再帰を使用して、Scalaで新しいメソッドを簡単に作成できることを利用します。
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1c)whileループの使用にフォールバック
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(2)例外をスローします。
object AllDone extends Exception { }
var sum = 0
try {
for (i <- 0 to 1000) { sum += i; if (sum>=1000) throw AllDone }
} catch {
case AllDone =>
}
(2a)Scala 2.8以降では、これはscala.util.control.Breaks
、C / Javaでおなじみの古いブレークによく似た構文を使用して事前にパッケージ化されています。
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(3)コードをメソッドに入れ、returnを使用します。
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
これは、少なくとも3つの理由が考えられるため、意図的に簡単ではありません。まず、大きなコードブロックでは、 "continue"および "break"ステートメントを見落としたり、実際よりも多いまたは少ないものから抜け出していると考えたり、実行できない2つのループを壊したりする必要があります。とにかく簡単-標準的な使用法は便利ですが、問題があるため、コードを別の方法で構造化する必要があります。第2に、Scalaにはおそらく気付かないほどのあらゆる種類のネストがあるため、問題が発生する可能性がある場合は、コードフローが(特にクロージャーで)どこに到達したかに驚かれるでしょう。第三に、Scalaの「ループ」のほとんどは実際には通常のループではありません。これらは独自のループを持つメソッド呼び出しです。ループのように、「ブレーク」などが何をすべきかを知るための一貫した方法を思いつくことは困難です。したがって、一貫性を保つために、賢明なことは、「ブレーク」をまったく行わないことです。
注:これらすべての機能に相当するものがあり、その場所で値を変更するのでsum
はなく、の値を返します。これらはより慣用的なScalaです。ただし、ロジックは変わりません。(return
となりreturn x
ます)。