主方法中的Scala App val初始化

时间:2012-01-31 12:43:50

标签: 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?
    }
}

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

2 个答案:

答案 0 :(得分:19)

如果您使用的是App特征,则无需覆盖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)

}

它的工作原理是因为App trait扩展了DelayedInit特征,它具有非常特殊的初始化过程。您甚至可以使用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)
    }

}

答案 1 :(得分:6)

DelayedInit特征(App扩展)会导致重写初始化代码,以便在特殊的delayedInit()方法中执行。然后,main通常会调用此方法。但是,由于您要覆盖main,因此永远不会调用delayedInit()代码,因此您的值不会被初始化。

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