Scala App初始化顺序

vit*_*aly 2 scala

所以我有一个简单的Scala文件:

object Main extends App {
  println("Init")

  def test=println("Method")
}
Main.test
println(Main)
print("End")
Run Code Online (Sandbox Code Playgroud)

当我将其作为脚本运行时,我得到以下输出:

$ scala Main.scala
Method
Main$$anon$1$Main$@2449a2da
End
Run Code Online (Sandbox Code Playgroud)

我想知道为什么这println("Init")条线永远不会被调用?我希望在Main的初始化时调用它,它应该在调用它的方法时发生.

om-*_*nom 6

让我们仔细看看App trait scaladoc:

应该注意的是,这个特性是使用DelayedInit功能实现的,这意味着在执行main方法之前,对象的字段不会被初始化.

所以你必须做以下事情:

object Main extends App {
  println("Init")

  def test=println("Method")
}
Main.main(Array.empty)     // here is the missing call
Main.test
println(Main)
print("End")
Run Code Online (Sandbox Code Playgroud)

获得所需的输出:

Init
Method
Main$$anon$1$Main$@37a001ff
End% 
Run Code Online (Sandbox Code Playgroud)