我在Scala的初学者级别,我正在尝试以下代码:
var i: Int = 0
for (i <- 0 to 10) {
if (i == 2) {
i += 1
}
println(i)
}
当我增加i
时,编译器会说Value += is not member of Int
。
答案 0 :(得分:6)
你宣布i
两次,一次在外部范围,一次在内部。您的理解力会查看内部i
,它是val
,而不是var
,因此会影响外部声明。
绑定到另一个名称:
var counter: Int = 0
for (i <- 0 to 10) {
if (i == 2) {
counter += 1
}
println(counter)
}
请注意,您可以使用count
:
val count = (0 to 10).count(i => i == 2)
println(count)
根据您的评论,我了解您要打印2
以外的所有数字。为此你需要否定你的条件:
if (i != 2) {
counter += 1
}
或者如果您只想过滤2:
(0 to 10).filter(_ != 2).foreach(println)
从您的评论中,看起来while
循环更适合您要实现的目标:
var i = 0
while (i < fruits.length) {
if (fruits(i) == "Banana") {
i += 1
println(i + " " + fruits(i))
} else if (fruits(i) == "Orange") {
i += 1
println(i + " " + fruits(i))
}
}
但是这段代码会遇到一个无限循环,因为如果满足条件,你只会递增i
。除此之外,由于你正在做i + 1
,如果最后一个元素等于“Banana”或“Orange”,你可能会超出界限,所以你可能想重新考虑你正在做的事情。你可能会遇到一个
答案 1 :(得分:2)
评论中提到的新错误如下:
scala> :pa
// Entering paste mode (ctrl-D to finish)
var i: Int = 0
for(i <- 0 to 10)
{
if (i == 2)
{
i += 1
}
println(i)
}
// Exiting paste mode, now interpreting.
<pastie>:19: error: value += is not a member of Int
Expression does not convert to assignment because receiver is not assignable.
i += 1
^
对于简单的情况,它应该说i
而不是receiver
,其中LHS不是一个复杂的表达式,但你明白了。
此外,没有人提到这一点:
scala> :pa
// Entering paste mode (ctrl-D to finish)
object X {
var i: Int = 0
for(i <- 0 to 10)
{
if (i == 2)
{
this.i += 1
}
println(this.i)
}}
// Exiting paste mode, now interpreting.
defined object X
scala> X
0
0
1
1
1
1
1
1
1
1
1
res3: X.type = X$@1129829c
答案 2 :(得分:2)
正如Yuval的回答中提到的那样,你要两次声明i
。不仅如此,内部的一个是隐式不可变的,因此你不可能改变它(这就是你得到编译错误的原因)。
要获得与变异相同的效果,你可以在理解中使用一个守卫,如下所示:
for (i <- 0 to 10 if i != 2) {
println(i)
}
此代码可以无缝翻译(以及编译器实际执行的操作)到以下
(0 to 10).withFilter(i => i != 2).foreach(i => println(i))