我有一些代码:
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方法中初始化?
答案 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
对象的主体来解决这个问题。