主方法中的Scala App-val初始化



我有一些代码:

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特性扩展了DelayedUnit特性,该特性具有非常特殊的初始化过程。您甚至可以使用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对象的主体中来解决这个问题。

相关内容

  • 没有找到相关文章