相关疑难解决方法(0)

前向引用 - 为什么这段代码会编译?

请考虑以下代码段:

 object A {
     val b = c
     val c = "foo"
 }
 println( A.b )   // prints "null"
Run Code Online (Sandbox Code Playgroud)

作为更大程序的一部分,这将导致运行时失败.编译器显然允许从'b'到(未初始化)'c'的前向引用,但是'b'留下c的原始空值.为什么允许这样做?是否有可以从此功能中受益的编程方案?

将代码更改为直接序列并且行为更改:

 val b = c
 val c = "foo"
 println( b )   // prints "foo"
Run Code Online (Sandbox Code Playgroud)

为什么行为不同?为什么这甚至有效?谢谢.

更新1:

问题出现了我如何运行第二个例子.我简化了设置并使用最新的Scala插件在IntelliJ IDEA 10.5.2中使用Scala 2.9.0.1编译它.这是确切的代码,在一个新创建的和其他空项目中,我用它来测试它,它在这种环境中编译并运行良好:

 package test
 object Main { 
    def main( args: Array[String] ) {
       val b = c
       val c = "foo"
       println( b )   // prints "foo"
    }
 }
Run Code Online (Sandbox Code Playgroud)

对于它的价值,IDEA还认为(当我点击"通过"对val b = c中的'c'的引用时)我指的是(c)的(后面)声明.

scala initialization lazy-evaluation

27
推荐指数
1
解决办法
4711
查看次数

Scala和前向引用

可能重复:
Scala:转发引用 - 为什么这段代码会编译?

object Omg {

  class A

  class B(val a: A)

  private val b = new B(a)

  private val a = new A

  def main(args: Array[String]) {
    println(b.a)
  }

}
Run Code Online (Sandbox Code Playgroud)

以下代码打印"null".在java中.由于前向引用无效,类似的构造无法编译.问题是 - 为什么它在Scala中编译得很好?这是设计,在SLS中描述还是仅仅是2.9.1中的错误?

scala compilation reference

21
推荐指数
3
解决办法
1万
查看次数