我有一些代码:
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
对象的主体中来解决这个问题。