当我运行此代码时 1)var b:Int = _。它在终端上运行良好
但是当我在IDE中运行时,它会出现编译错误。 我在这里错过了什么吗?
答案 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$