我有一些代码:

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

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


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

最佳答案

如果使用的是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特征扩展了具有非常特殊的初始化过程的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)
    }

}

10-01 21:46