Scala 和前向引用

标签 scala reference compilation

这个问题在这里已经有了答案:




8年前关闭。




Possible Duplicate:
Scala: forward references - why does this code compile?


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)
  }

}

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

最佳答案

这不是错误,而是学习 Scala 时的经典错误。当对象Omg初始化后,首先将所有值设置为默认值(在本例中为 null),然后运行构造函数(即对象主体)。

要使其工作,只需添加 lazy您要前向引用的声明前面的关键字(在本例中为值 a):

object Omg {

  class A

  class B(val a: A)

  private val b = new B(a)

  private lazy val a = new A

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

a然后将根据需要进行初始化。

这种构造速度很快(所有应用程序运行时的值只初始化一次)并且是线程安全的。

关于Scala 和前向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12184997/

相关文章:

java - 查找正确的 jar 文件以使用 scala 示例

scala - Spark 异常退出

scala - "using/try-with-resources"的简单 Scala 模式(自动资源管理)

c# - 自定义包含 List<ReferenceObject> c#

Scala/Lift 框架仅在 jetty Web 服务器上运行?

pointers - 预先存储对指针的引用与在移动中引用指针之间的区别

reference - 在 LaTeX 中格式化引用书目

C: undefined reference... 对在别处成功使用的库

c - 在 OS X 上构建 libical-1.0 失败

c - 为什么 "implicit declaration of function"只是一个警告?