gpt4 book ai didi

scala - 嵌套对象和成员变量的构造顺序

转载 作者:行者123 更新时间:2023-12-02 04:06:47 24 4
gpt4 key购买 nike

我在 REPL 中创建了这个对象。然后在下面的附图中测试其设置顺序。结果令人困惑。

object T {
val default = A
var options = List[P]()
println(options)

sealed trait P

object A extends P {
override def toString = "A"
println(T.options)
println("A")
}

object B extends P {
override def toString = "B"
println(T.options)
println("A")
}

object C extends P {
override def toString = "C"
println(T.options)
println("A")
}
}
  1. 在第一次运行 T 中,似乎只构造了内部对象 A。为什么对象 B 和对象 C 不打印任何内容?

  2. 另请注意,第一次运行时 println(T.options) 返回“null”。这是因为首先设置内部对象,然后设置外部对象其他成员吗?

  3. 输入 T.A 时不会打印任何内容,因为该对象已设置。

  4. 在输入 T.B 时,它会设置 B 对象并正确打印 T.options,即 List() 而不是 null。

enter image description here

最佳答案

In the first run, T, only the inner object A seems to be constructed. Why dont the object B and object C print anything??

因为它们没有初始化,所以它们只是声明A 打印出来的原因是:

val default = A

这会导致A初始化。初始化的顺序是:

  1. Tdefault变量导致A初始化
  2. A 初始化并打印 null
  3. T 现在继续初始化,并为 options 设置一个值

任何进一步的调用现在都将打印列表的内容,而不是 null

Also note that println(T.options) in the first run returns "null". Is this because first inner objects are setup and then the outer objects other members are setup?

这是因为 println(T.options) 发生在 A 的构造函数中,它先于 T 内的 options 初始化 的构造函数。

On typing T.A nothing is printed because the object is already setup.

这完全有道理,A 不需要初始化任何其他内容。

On typing T.B it sets up the B object and prints the T.options correctly i.e List() instead of null.

没错,因为一旦调用 T.B,您就已经通过 T 的构造函数初始化了列表。

关于scala - 嵌套对象和成员变量的构造顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39124221/

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