Scala编译错误:值+ =不是Int的成员

时间:2017-01-16 08:09:08

标签: scala

我在Scala的初学者级别,我正在尝试以下代码:

var i: Int = 0

for (i <- 0 to 10) {
  if (i == 2) { 
     i += 1     
  }

  println(i)
}

当我增加i时,编译器会说Value += is not member of Int

3 个答案:

答案 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)

编辑2:

从您的评论中,看起来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))