以下のコードは 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」の署名を調べると、これが何であるかわかりません。
for
in scala はループではなく、 a と呼ばれるものcomprehension
です。あなたの場合、を作成するRange.foreach
ため、単に を呼び出します。次に、範囲内の各値に対して foreach に渡す関数を再帰的に呼び出します。0 until 10
Range
編集:
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
}
for
foreach
Scala のコレクションに対するメソッドとして解釈されます。実際に実行されるのは
(0 until 10) foreach { i => println(i) }
あなたが言及したように、until
2つの整数を取り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(_))