以下のコードは 0,1,2,3,4,5,6,7,8,9 を出力します
for (i <- 0 until 10) {
println(i)
変数「i」はどのようにインクリメントされていますか? 暗黙の何かが発生していると思われますが、Range を返す「until」の署名を調べると、これが何であるかわかりません。
以下のコードは 0,1,2,3,4,5,6,7,8,9 を出力します
for (i <- 0 until 10) {
println(i)
変数「i」はどのようにインクリメントされていますか? 暗黙の何かが発生していると思われますが、Range を返す「until」の署名を調べると、これが何であるかわかりません。
forin scala はループではなく、 a と呼ばれるものcomprehensionです。あなたの場合、を作成するRange.foreachため、単に を呼び出します。次に、範囲内の各値に対して foreach に渡す関数を再帰的に呼び出します。0 until 10Range
編集:
for見た目に応じてmap、flatMap、 、foreach、filter...へのネストされた呼び出しが作成されます。
例えば:
for {
x <- 0 until 10
y <- 0 until 10
} yield x * y
にコンパイルされます
(0 until 10) flatMap { x =>
(0 until 10) map { y =>
x*y
}
}
と
for {
x <- 0 until 10
if x % 2 == 0
} yield x * 2
のようなものにコンパイルされます
(0 until 10).filter { x =>
x % 2 == 0
}.map { x =>
x * 2
}
forforeachScala のコレクションに対するメソッドとして解釈されます。実際に実行されるのは
(0 until 10) foreach { i => println(i) }
あなたが言及したように、until2つの整数を取りRange、シーケンス{0,1,2,...,9}であるaを返します。あなたのプログラムは、これらの 10 個の数字のそれぞれを調べて、それに関数printlnを適用します。一言で言えば、 の基本的な実装はfor関数型プログラミング スタイルであり、インクリメントを行う必要はありません。
0 から 10 までが範囲を定義します。
for 内包表記は次のように展開されます。
(0 until 10) foreach { println(_) }
範囲が拡張された後は、次のようになります。
(Seq(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) foreach { println(_) }
until中置記法で呼び出されるメソッドで、 を返しますRange。見た目は基本的にこれforの繰り返しRangeです。これは、同じものの別の表記法です。
0.until(10).foreach(println(_))