首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么关于抽象特征成员val初始化的微小变化的结果会有所不同?

为什么关于抽象特征成员val初始化的微小变化的结果会有所不同?
EN

Stack Overflow用户
提问于 2010-09-17 13:53:02
回答 2查看 194关注 0票数 2

我得到了下面的代码片段,参考了“Scala编程”第6章中的一个例子:

代码语言:javascript
复制
object HelloWorld {
  def main(args: Array[String]) {
    trait AbstractT2 {
      println("In AbstractT2:")
      val value: Int
      val inverse = 1.0 / value // ???
      println("AbstractT2: value = " + value + ", inverse = " + inverse)
    }

    val c2b = new AbstractT2 {
      println("In c2b:")   //---->line 1
      val value = 10       //---->line 2
    }
    println("c2b.value = " + c2b.value + ", inverse = " + c2b.inverse)
  }
}

上面代码的结果是:

代码语言:javascript
复制
In AbstractT2:
AbstractT2: value = 0, inverse = Infinity
In c2b:
c2b.value = 10, inverse = Infinity

由于匿名类初始化是在特征初始化之后进行的,因此结果是可以理解的。但是,如果我在上面的示例中交换线路1和线路2,以便在println("In c2b:")之前使用val value = 10,结果将是:

代码语言:javascript
复制
In AbstractT2:
AbstractT2: value = 10, inverse = 0.1
In c2b:
c2b.value = 10, inverse = 0.1

这一次初始化似乎是成功的,尽管从语言的角度来看是错误的。我不明白为什么。有人能帮上忙吗?非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-17 22:04:11

在超类构造函数之前,多达2.7次Scala移动值初始化,直到遇到引用this的初始化。到此为止它就会停下来。很早以前,为了让一些组合模式正常工作,这种行为是必要的。后来,我们引入了早期定义,以使相同的模式以更健壮的方式工作。但由于行为很难改变,我们直到2.8才真正做到这一点。

票数 3
EN

Stack Overflow用户

发布于 2010-09-17 15:48:35

初始化语义从2.7更改为2.8。这是提交,早在2008年。“戴上安全帽!”

https://lampsvn.epfl.ch/trac/scala/changeset/16745

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3732933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档