object Test {
def main(args: Array[String]) {
inner()
var x: Int = 5
def inner() {
println("x: " + x)
}
}
}
试图编译它会产生以下错误消息:
test.scala:3: error: forward reference extends over definition of variable x
inner()
^
one error found
问题:
检查函数是否是闭合,可以访问当前范围的变量, 检查实际上确实在当前范围中访问变量,并且
对于每个变量,闭合访问都会访问,请检查是否在调用之前定义了该变量
我基本上回答了我的第三个问题?这是这种行为的工作方式吗?这似乎使编译器很复杂(特别是如果我们考虑具有多个功能级别的病例)。如果是这种情况,这如何集成到语言的形式定义中,即语法?在我看来,我编写的程序在语法上是正确的。
•如果SK是一个值定义,则必须是懒惰的
此错误消息意味着不允许在块中进行正向参考。在一个块中,所有变量(或值)必须按线性顺序定义。
由于val“ x”是一个字段初始化语句,因此在初始化之前将其引用是非法的(“ x”在初始化之前包含null)。
以使其正常工作,您可以将VAR更改为懒惰的Val:
def main() { // forward reference for lazy vals is allowed in a block
def inner() {
println("x: " + x)
}
lazy val x: Int = 5
}
法律示例,其中调用懒惰的val的方法在懒惰的val表达式之前被调用:
def main() {
inner()
def inner() {
println("x: " + x)
}
lazy val x: Int = 5
}
没有“ x”很懒惰,x”将被右开始,这打破了Scala编译器执行的重新检查阶段。
对于这种行为背后的一点点理论,您可以查看以下内容的“阶段refchecks”部分:https://wiki.scala-lang.org/display/siw/siw/overview++feiw+compiler+compiler+plosees