我的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方法之前被初始化。
我做错了什么?谢谢!
答案 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
的全部内容。