[解決済み] Scalaでループから抜け出すにはどうしたらいいですか?
質問
ループを解除するにはどうしたらいいですか?
var largest=0
for(i<-999 to 1 by -1) {
for (j<-i to 1 by -1) {
val product=i*j
if (largest>product)
// I want to break out here
else
if(product.toString.equals(product.toString.reverse))
largest=largest max product
}
}
ネストされたforループを末尾再帰にするにはどうしたらいいですか?
FOSDEM 2009でのScalaトークより http://www.slideshare.net/Odersky/fosdem-2009-1013261 を22ページ目に掲載しました。
ブレークとコンティニュー Scalaにはありません。なぜでしょうか? ちょっと命令形になってしまうので、もっと小さな関数をたくさん使ったほうがいい。 クロージャとの付き合い方を問題視する。 必要ない!
どのような説明でしょうか?
どのように解決するのですか?
ループから抜け出すには、3つ(程度)の選択肢があります。
合計が1000より大きくなるまで数字を合計したいとします。 そこで
var sum = 0
for (i <- 0 to 1000) sum += i
ただし、(sum > 1000)で停止させたい場合。
どうすればいいのでしょうか? いくつかの選択肢があります。
(1a) テストする条件を含む何らかの構成物を使用する。
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(警告--これは、takeWhileテストとforeachが評価中にどのように交信されるかの詳細に依存し、おそらく実際には使用すべきではありません!)。
(1b) Scalaでは新しいメソッドを簡単に書けることを利用して、forループの代わりに末尾再帰を使用します。
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つのループを脱落させる必要があったりしがちです--したがって標準の使用法は便利ですが問題があり、したがってコードを別の方法で構成するようにすべきです。 第二に、Scalaには、おそらくあなたが気づかないようなあらゆる種類の入れ子構造があって、もしあなたが物事を断ち切ることができたら、おそらくコードフローが行き着く先に驚くことでしょう(特にクロージャの場合はそうです)。 第三に,Scala の "loops" のほとんどは,実は普通のループではありません。それ自体がループになっているメソッド呼び出しであったり,ループであるかどうかわからない再帰であったりしますが,それらは 行為 ループのように、"break" などはどうすればいいのか、一貫した方法を思いつくのは難しいです。 ですから、一貫性を保つためには、"break"を全く持たない方が賢明です。
備考
: の値を返すような、これらすべての関数に相当するものがあります。
sum
その場で変異させるのではありません。 これらはよりScalaらしいイディオムです。 しかし、ロジックは同じです。 (
return
は
return x
など)。
関連
-
[解決済み] jQueryの各ループから抜け出すには?
-
[解決済み] scalaのforeachループ
-
[解決済み] JavaScriptのオブジェクトをループスルーまたは列挙するにはどうすればよいですか?
-
[解決済み] Bashで変数で定義された数値の範囲を反復処理するにはどうすればよいですか?
-
[解決済み] Javaでenumを繰り返し処理するためのforループ
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み] 多重ループから抜け出すには?
-
[解決済み】Perlでループから抜け出すには?
-
[解決済み】コマンドラインパラメータを解析する最良の方法?[クローズド]
-
[解決済み] sbtのScalaTest:タグなしで単一のテストを実行する方法はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] スパークSPLラウンド&ブラウンド
-
[解決済み] Scalaでループから抜け出すにはどうしたらいいですか?
-
[解決済み] Scala subString関数
-
[解決済み] 実行時に変数の型を取得したい
-
[解決済み] NotUsedとDoneの理解
-
[解決済み】タスクがシリアライズされない:オブジェクトではなくクラスに対してのみクロージャの外で関数を呼び出すとjava.io.NotSerializableExceptionが発生する
-
[解決済み】Scalaのyieldとは何ですか?
-
[解決済み] Scalaは、コレクションをMap-by-keyに変換する最良の方法ですか?
-
[解決済み] Scalaで環境変数を読み込む方法
-
[解決済み] Scalaの==と.equalsの違いは何ですか?