主方法中的Scala App val初始化

主方法中的Scala App val初始化,scala,null,main,Scala,Null,Main,我有一些代码: object Main extends App { val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r override def main (args:Array[String]) { // Why is NameTemplate null here? } } 为什么namemplate没有在main方法中初始化?如果您使用的是Apptrait,那么您不需要重写main方法-只需

我有一些代码:

object Main extends App
{
    val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r

    override def main (args:Array[String])
    {
        // Why is NameTemplate null here?
    }
}

为什么
namemplate
没有在main方法中初始化?

如果您使用的是
App
trait,那么您不需要重写
main
方法-只需将代码写入
对象的主体中即可:

object Main extends App {
    val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r

    println(NameTemplate)

    val NameTemplate(name, version) = args(0)

    println(name + " v" + version)

}
它之所以能工作,是因为
App
trait扩展了trait,它有非常特殊的初始化过程。您甚至可以使用
args
访问参数,如示例所示

如果不想扩展
App
,您仍然需要编写
main
方法,但在这种情况下,它将按预期工作:

object Main {
    val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r

    def main(args: Array[String]) {
        println(NameTemplate)

        val NameTemplate(name, version) = args(0)

        println(name + " v" + version)
    }

}

DelayedInit
特性(扩展了
App
的特性)导致初始化代码的重写在一个特殊的
DelayedInit()
方法中执行。这通常会由
main
调用。但是,由于您正在重写
main
,因此不会调用
delayedInit()
代码,因此不会初始化您的值

正如@tenshi所解释的,您可以通过不扩展
App
或将主代码移动到
main
对象的主体中来解决这个问题