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

时间:2011-07-08 17:56:55

标签: scala

我的Scala版本:

Scala code runner version 2.9.0.1 -- Copyright 2002-2011, LAMP/EPFL

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

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

当我跑步时:

scalac Static.scala && scala Main

我明白了:

null

而不是:

Hello, World!

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

我做错了什么?谢谢!

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:1)

尝试

lazy val x = "Hello World"

这应该会给你你期望的结果。

答案 2 :(得分:1)

您不支持在扩展main的对象上使用App方法。如果你覆盖它,你就会更好地理解DelayedInit的工作原理。特别是,扩展App 的对象没有静态初始化 - 这是App的全部内容。