Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 嵌套对象和成员变量的构造顺序_Scala - Fatal编程技术网

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

Scala 嵌套对象和成员变量的构造顺序,scala,Scala,我在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 {

我在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")
  }
}
  • 在第一次运行T中,似乎只构造了内部对象A。为什么对象B和对象C不打印任何内容

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

  • 键入T时,不会打印任何内容,因为对象已设置

  • 键入T.B时,它设置B对象并正确打印T.options,即List()而不是null

  • 在第一次运行中,
    T
    ,似乎只构造了内部对象
    A
    。 为什么对象
    B
    和对象
    C
    不打印任何内容

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

    val default = A
    
    这会导致
    A
    初始化。因此,初始化的顺序是:

  • T
    s
    default
    变量导致
    A
    初始化
  • A
    初始化并打印
    null
  • T
    现在继续初始化,并将值设置为
    options
  • 任何进一步的调用现在都将打印列表的内容,而不是
    null

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

    这是因为
    println(T.options)
    发生在
    A
    s构造函数中,它在
    T
    s构造函数中的
    options
    初始化之前

    键入
    T.A
    时,由于对象已设置,因此不会打印任何内容

    这很有道理,
    A
    没有任何需要初始化的附加内容

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


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

    感谢您的详细解释。
    val default=A
    是这里的魔鬼(@Samar,不客气。是的,这就是导致一连串调用的原因。