在Scala中,静态值初始化似乎不会在调用main方法之前发生

Tim*_*art 8 scala

我的Scala版本:

Scala code runner version 2.9.0.1 -- Copyright 2002-2011, LAMP/EPFL
Run Code Online (Sandbox Code Playgroud)

在名为Static.scala的文件中给出此代码:

object Main extends App {
  val x: String = "Hello, World!"
  override def main(args: Array[String]): Unit = {
    println(x)
  }
}
Run Code Online (Sandbox Code Playgroud)

当我跑:

scalac Static.scala && scala Main
Run Code Online (Sandbox Code Playgroud)

我知道了:

null
Run Code Online (Sandbox Code Playgroud)

代替:

Hello, World!
Run Code Online (Sandbox Code Playgroud)

我认为x是静态的,因为它是在一个对象中定义的,并且它将在调用main方法之前初始化.

我究竟做错了什么?谢谢!

Geo*_*edy 11

这是因为您使用App特征的方式.App trait使用DelayedInit功能,该功能更改了类主体(包括字段初始化)的执行方式.App trait包含一个main方法,该方法在将args字段绑定到程序的参数之后执行类主体.由于你已经覆盖了main,因此不会发生这种初始化.使用App特征时,不应提供主要方法.您应该将应用程序代码直接放在类主体中,或者不从App trait继承.