我正在用 Scala 撰寫,在這個 if 陳述句中我有一個 for 回圈,我初始化了 i=0 并在 for 回圈中使用了 i。它告訴我沒有使用宣告,但我在 for 回圈中使用它。頂部也總是等于 5。
else {
var i = 0
for (i <- 0 until (top))
uj5u.com熱心網友回復:
For 回圈在 Scala 中的作業方式與其他語言略有不同。在 Scala 中,for理解是對foreach, filter, map/flatMap 高階函式的語法糖。
當你寫
for (i <- 0 until top)
編譯器將其重寫為
(0 until top).foreach {
i => ...
}
這里,foreach主體是一個匿名函式,其中i是與可迭代物件具有相同型別的函式引數。因此,您可以洗掉i代碼片段中的宣告。
uj5u.com熱心網友回復:
就像之前發布的那樣for,Scala 中的與例如 Java 中的非常不同。將其用作迭代器只是其眾多潛在用途之一。
對于您的代碼:第一個和第二個i不相同。事實上,for運算式中的變數是短暫的,并不離開for的作用域,但實際上隱藏了外部的作用域。
var i = 0 // you don't need this
for (i <- 0 until (top)) // loops from 0 to whatever top is regardless what's in the outer i
這將列印0 1 2 3 4:
val top = 5
for (i <- 0 until (top)) {
println(i)
}
一個非常酷的方面for來自yield關鍵字(來自第一個鏈接的示例):
val names = List("adam", "david", "frank")
val ucNames = for (name <- names) yield name.capitalize
它還用于在多個集合/單子等上進行映射,就像在 Haskell 中一樣,否則這項任務相當乏味:
val names = List("adam", "david")
val numbers = List(1, 2)
val lst = for {
name <- names
number <- numbers
} yield s"$name: $number"
lst現在將兩個串列的笛卡爾積保存為List[String]:List("adam: 1", "adam: 2", "david: 1", "david: 2")
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327042.html
下一篇:只獲取地圖的第一個元素
