主方法中的Scala App val初始化

Len*_*nar 19 null program-entry-point scala

我有一些代码:

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

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

为什么NameTemplate不在main方法中初始化?

ten*_*shi 19

如果您正在使用Apptrait,那么您不需要覆盖main方法 - 只需在以下内容中编写代码object:

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

    println(NameTemplate)

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

    println(name + " v" + version)

}
Run Code Online (Sandbox Code Playgroud)

它的工作原理是因为Apptrait扩展了DelayedInit trait,它具有非常特殊的初始化过程.您甚至可以使用参数访问参数args,如示例所示.

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

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)
    }

}
Run Code Online (Sandbox Code Playgroud)


Sub*_*oid 6

DelayedInit性状(其App延伸)引起的intialisation代码重写到一个特殊的内执行delayedInit()方法.然后通常会调用它main.main但是,由于您要覆盖,因此delayedInit()永远不会调用代码,因此您的值不会被初始化.

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