2013-01-10 48 views
4

下面代碼打印0,1,2,3,4,5,6,7,8,9'i'變量在這個循環中如何遞增?

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

如何使用var '我' 是會增加嗎?我懷疑有隱含的事情發生,但檢查'直到'返回一個範圍的簽名我不知道這是什麼?

回答

11

for in scala不是一個循環,而是一個叫做comprehension的東西。在你的情況下,它只需調用Range.foreach,因爲0 until 10創建了一個Range。然後它只是遞歸地調用你傳遞給foreach的函數來獲取範圍中的每個值。

編輯

取決於究竟你for的容貌,它會創建嵌套調用mapflatMapforeachfilter ...

如:

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 
} 
3

0至10定義一個範圍。

的理解力被擴展到以下幾點:

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

其中,後擴大的範圍是類似於:

(Seq(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) foreach { println(_) } 
+0

'範圍'從來沒有擴展到包含所有元素(如果你的意思是「展開」)的'Seq'。 – sschaef

+0

@sschaef - 這就是爲什麼我說類似。我知道這不是一個確切的翻譯。 –

6

for是Scala解釋爲foreach方法在集合。那麼,什麼是真正的執行是

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

至於你提到的until需要2個整數,並返回一個Range,這是一個序列{0,1,2,...,9}。您的程序會遍歷這10個數字中的每一個,並對其應用功能println。總之,for的底層實現是功能編程風格,不需要增加。

0

until是一種方法 - 它返回一個Range - 中綴符號調用。 for的外觀基本上是對這個Range的迭代。這是同一事物的不同符號:

0.until(10).foreach(println(_))