宣言从未使用过——但它是



我在Scala中写作,在这个if语句中,我有一个for循环,我初始化了I=0,并在for中使用了I。它告诉我没有使用声明,但我在for循环中使用它top也总是等于5。

else {
var i = 0
for (i <- 0 until (top))

For循环在Scala中的工作方式与其他语言略有不同。在Scala中,for理解是对foreachfiltermap/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")

最新更新