gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:13:08 25 4
gpt4 key购买 nike

我得到了以下代码片段,引用了“Programming Scala”第 6 章中的一个示例:

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

上面代码的结果是:

In AbstractT2:
AbstractT2: value = 0, inverse = Infinity
In c2b:
c2b.value = 10, inverse = Infinity

由于匿名类初始化是在trait初始化之后,所以结果是可以理解的。但是,如果我在上面的示例中交换第 1 行和第 2 行,以便 val value = 10 位于 println("In c2b:") 之前,结果将是:

In AbstractT2:
AbstractT2: value = 10, inverse = 0.1
In c2b:
c2b.value = 10, inverse = 0.1

虽然从语言的角度来看是错误的,但这次似乎初始化成功了。我不明白为什么。有人可以帮忙吗?非常感谢。

最佳答案

初始化语义从 2.7 更改为 2.8。这是 2008 年的 promise 。“戴上安全帽!”

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

关于scala - 为什么关于抽象特征成员 val 初始化的微小变化结果会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3732933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com