构造函数中的语句按文本顺序执行,这就是为什么在初始化
a
指未初始化的
b
。以一种你甚至没有收到警告的方式组成一个类是一个常见的错误。(这里有一个常见问题教程。)
在局部语句序列中禁止使用相同的文本:
scala> :pa
// Entering paste mode (ctrl-D to finish)
locally {
val a = 10 + b
lazy val b = 5
println(a)
}
// Exiting paste mode, now interpreting.
<console>:13: error: forward reference extends over definition of value a
val a = 10 + b
^
一
在施工期间进行评估。
scala> :pa
// Entering paste mode (ctrl-D to finish)
object X {
val a = 10 + b
lazy val b = 5
println(a)
}
// Exiting paste mode, now interpreting.
defined object X
scala> X
15
res1: X.type = X$@6a9344f5
object X {
def main(args: Array[String]): Unit =
new AnyRef {
val a = 10 + b
lazy val b = 5
println(a)
}
}
main
或是延伸
App
,它不会包装代码,而是直接使用它。
这三种配方之间存在细微差异。例如,顶级对象的构造函数作为静态初始值设定项运行;但是一个
特殊情况下运行初始化器代码为
应用程序
因为这让人困惑。)