4

以下のコードは 0,1,2,3,4,5,6,7,8,9 を出力します

for (i <- 0 until 10) {
    println(i) 

変数「i」はどのようにインクリメントされていますか? 暗黙の何かが発生していると思われますが、Range を返す「until」の署名を調べると、これが何であるかわかりません。

4

4 に答える 4

11

forin scala はループではなく、 a と呼ばれるものcomprehensionです。あなたの場合、を作成するRange.foreachため、単に を呼び出します。次に、範囲内の各値に対して foreach に渡す関数を再帰的に呼び出します。0 until 10Range

編集

for見た目に応じてmapflatMap、 、foreachfilter...へのネストされた呼び出しが作成されます。

例えば:

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
}
于 2013-01-10T15:24:33.030 に答える
6

forforeachScala のコレクションに対するメソッドとして解釈されます。実際に実行されるのは

(0 until 10) foreach { i => println(i) }

あなたが言及したように、until2つの整数を取りRange、シーケンス{0,1,2,...,9}であるaを返します。あなたのプログラムは、これらの 10 個の数字のそれぞれを調べて、それに関数printlnを適用します。一言で言えば、 の基本的な実装はfor関数型プログラミング スタイルであり、インクリメントを行う必要はありません。

于 2013-01-10T15:23:32.443 に答える
3

0 から 10 までが範囲を定義します。

for 内包表記は次のように展開されます。

(0 until 10) foreach { println(_) }

範囲が拡張された後は、次のようになります。

(Seq(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) foreach { println(_) }
于 2013-01-10T15:23:01.620 に答える
0

until中置記法で呼び出されるメソッドで、 を返しますRange。見た目は基本的にこれforの繰り返しRangeです。これは、同じものの別の表記法です。

0.until(10).foreach(println(_))
于 2013-01-10T15:25:08.307 に答える