斯卡拉应用VAL初始化我有一些代码:在main方法
object Main extends App
{
val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r
override def main (args:Array[String])
{
// Why is NameTemplate null here?
}
}
为什么NameTemplate
不是主要方法中初始化?
斯卡拉应用VAL初始化我有一些代码:在main方法
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)
}
}
的DelayedInit
特征(这App
扩展)导致intialisation重写代码在特殊的delayedInit()
方法中执行。这通常将由main
调用。但是,由于您优先于main
,因此不会调用delayedInit()
代码,因此您的值不会被初始化。
正如@tenshi所解释的,您可以通过不扩展App
或将主代码移动到您的Main
对象的主体中来解决此问题。