Scala 处理中的 for 问题

Issue with for in Scala Processing

在下面的代码中,当我尝试 i = i + 10 时,它无法编译,错误为 cannot reassign to val。所以我在 for 之前添加了 var i = 0;,但从未使用过该变量:

var i = 0;
for(i <- 5 to 25) {
    i = i + 10
    ellipse(150, 150, tamano + i, tamano + i)
}

那是因为 i 是一个 val,因为它是传递给 foreach 的函数的参数(这是你的 for 理解去糖化的):

for(i <- 5 to 25) {
  doWorkWith(i)
}

变成:

(5 to 25).forEach(i => doWorkWith(i))

参数是不可变的,因此您不能重新分配 i

此处的解决方案是为您的中间值使用另一个名称:

for(i <- 5 to 25) {
    val offset = i + 10
    ellipse(150, 150, tamano + offset, tamano + offset)
}

(或者,在这种情况下,您可以将范围从 5 to 25 更改为 15 to 35 并避免额外添加)

您应该通过在线 Scala 教程来熟悉一些 Scala 习语。这将涵盖此类问题。

当您在 Scala 中使用 for 时,每个循环都会创建一个新的 val。在您的示例中,for 中的 i 覆盖了永远不会被使用的外部 var i

在 Scala 中,无法重新分配 vals。您始终可以通过以下方式分配新的 val

val j = i + 10

然后使用j

此代码与惯用的 Scala 相去甚远,Scala 很大程度上基于不变性的思想。您可以尝试以下操作:

for(i <- 5 to 25 by 10) {
    ellipse(150, 150, tamano + i, tamano + i)
}

或:

(5 to 25 by 10).foreach { i =>
    ellipse(150, 150, tamano + i, tamano + i)
}

另请注意,toby 只是 Range 对象上的方法的语法糖:

Range.inclusive(start = 5, end = 25, step = 10) == (5 to 25 by 10) //true