var b:Int = _给出编译错误

时间:2017-12-14 10:02:15

标签: scala

当我运行此代码时 1)var b:Int = _。它在终端上运行良好

但是当我在IDE中运行时,它会出现编译错误。 我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:4)

  

注意:变量的默认初始化在类或对象内部起作用,但是它在函数内部不起作用(局部变量)。

您正尝试在函数

中使用默认值初始化
scala> :paste
// Entering paste mode (ctrl-D to finish)

def foo(a: Int): Int = {
var b: Int = _
a
}

// Exiting paste mode, now interpreting.

<pastie>:12: error: local variables must be initialized
       var b: Int = _
           ^

可以在类或对象中使用它

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Foo {
var i: Int = _
}

// Exiting paste mode, now interpreting.

defined class Foo

使用对象

scala> :paste
// Entering paste mode (ctrl-D to finish)

object Bar {
var i: Int = _
}

// Exiting paste mode, now interpreting.

defined object Bar

为什么它适用于REPL?

scala> var i: Int = _
i: Int = 0

直接写在REPL提示符下的所有东西都会被一个对象默认包装,这就是为什么我们不会在REPL上出现这个错误。

为了证明这一说法,默认情况下,在REPL上写的内容是由一个对象包装的。让我们写一个小函数来使用this来引用上下文中的当前对象。

scala> :paste
// Entering paste mode (ctrl-D to finish)

def experiment(): Unit = println(s"${this.getClass}")
experiment()

// Exiting paste mode, now interpreting.

class $line13.$read$$iw$$iw$
experiment: ()Unit

酷!有用。我们的代码由此容器$line13.$read$$iw$$iw$

包围