cor*_*zza 1 compiler-construction variables scope scala function
考虑这个基本的Scala示例代码:
object Test {
def main(args: Array[String]) {
inner()
var x: Int = 5
def inner() {
println("x: " + x)
}
}
}
Run Code Online (Sandbox Code Playgroud)
尝试编译它会产生以下错误消息:
test.scala:3: error: forward reference extends over definition of variable x
inner()
^
one error found
Run Code Online (Sandbox Code Playgroud)
问题:
这个问题并不是关于定义的顺序,而是确切地调用函数的时候.在定义函数之前调用函数是完全合法的 - 但如果在调用和函数定义之间放置一个变量,并且函数使用此变量,它就会突然变为非法.
我想解释这个语言功能!为什么会这样?它是如何工作的?是否还有其他更复杂的例子 - 即它只是某些其他功能的一部分还是某些规则的结果?
我想象编译器目前在做什么:
我基本上回答了我的第三个问题吗?这是这种行为的工作原理吗?它似乎使编译器复杂化(特别是如果我们考虑具有多级函数的情况).
如果是这种情况,它如何融入语言的正式定义,即语法?在我看来,我写的程序在语法上是正确的.
来自http://www.scala-lang.org/docu/files/ScalaReference.pdf:
声明或定义引入的名称范围是包含绑定的整个语句序列.然而,块中的前向引用存在限制:在语句序列s1 ... sn中构成块,如果si中的简单名称是指由sj定义的实体,其中j> = i,那么对于所有sk之间的sk包括si和sj,
•sk不能是变量定义.
•如果sk是一个值定义,它必须是懒惰的
| 归档时间: |
|
| 查看次数: |
1102 次 |
| 最近记录: |