我在Scala中写作,在这个if语句中,我有一个for循环,我初始化了I=0,并在for中使用了I。它告诉我没有使用声明,但我在for循环中使用它top也总是等于5。
else {
var i = 0
for (i <- 0 until (top))
For循环在Scala中的工作方式与其他语言略有不同。在Scala中,for
理解是对foreach
、filter
、map
/flatMap
高阶函数的语法糖。
当你写
for (i <- 0 until top)
编译器将其重新写入
(0 until top).foreach {
i => ...
}
这里,foreach
主体是一个匿名函数,其中i
是与可迭代对象具有相同类型的函数参数。因此,您可以在代码片段中删除i
的声明。
就像之前发布的一样,Scala中的for
与Java中的CCD-9是一种非常不同的动物。将其用作迭代器只是其众多潜在用途之一
对于您的代码:第一个和第二个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中那样同时映射多个集合/monad等,否则这项任务相当乏味:
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")