Len*_*nar 19 null program-entry-point scala
我有一些代码:
object Main extends App
{
val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r
override def main (args:Array[String])
{
// Why is NameTemplate null here?
}
}
Run Code Online (Sandbox Code Playgroud)
为什么NameTemplate不在main方法中初始化?
ten*_*shi 19
如果您正在使用Apptrait,那么您不需要覆盖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)
}
Run Code Online (Sandbox Code Playgroud)
它的工作原理是因为Apptrait扩展了DelayedInit trait,它具有非常特殊的初始化过程.您甚至可以使用参数访问参数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)
}
}
Run Code Online (Sandbox Code Playgroud)
的DelayedInit性状(其App延伸)引起的intialisation代码重写到一个特殊的内执行delayedInit()方法.然后通常会调用它main.main但是,由于您要覆盖,因此delayedInit()永远不会调用代码,因此您的值不会被初始化.
正如@tenshi解释的那样,你可以通过不扩展App或将主代码移动到Main对象的主体中来解决这个问题.