下面代碼打印0,1,2,3,4,5,6,7,8,9'i'變量在這個循環中如何遞增?
for (i <- 0 until 10) {
println(i)
如何使用var '我' 是會增加嗎?我懷疑有隱含的事情發生,但檢查'直到'返回一個範圍的簽名我不知道這是什麼?
下面代碼打印0,1,2,3,4,5,6,7,8,9'i'變量在這個循環中如何遞增?
for (i <- 0 until 10) {
println(i)
如何使用var '我' 是會增加嗎?我懷疑有隱含的事情發生,但檢查'直到'返回一個範圍的簽名我不知道這是什麼?
for
in scala不是一個循環,而是一個叫做comprehension
的東西。在你的情況下,它只需調用Range.foreach
,因爲0 until 10
創建了一個Range
。然後它只是遞歸地調用你傳遞給foreach的函數來獲取範圍中的每個值。
編輯:
取決於究竟你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
}
0至10定義一個範圍。
的理解力被擴展到以下幾點:
(0 until 10) foreach { println(_) }
其中,後擴大的範圍是類似於:
(Seq(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) foreach { println(_) }
for
是Scala解釋爲foreach
方法在集合。那麼,什麼是真正的執行是
(0 until 10) foreach { i => println(i) }
至於你提到的until
需要2個整數,並返回一個Range
,這是一個序列{0,1,2,...,9}。您的程序會遍歷這10個數字中的每一個,並對其應用功能println
。總之,for
的底層實現是功能編程風格,不需要增加。
until
是一種方法 - 它返回一個Range
- 中綴符號調用。 for
的外觀基本上是對這個Range
的迭代。這是同一事物的不同符號:
0.until(10).foreach(println(_))
'範圍'從來沒有擴展到包含所有元素(如果你的意思是「展開」)的'Seq'。 – sschaef
@sschaef - 這就是爲什麼我說類似。我知道這不是一個確切的翻譯。 –