2012-01-31 51 views
18

斯卡拉应用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不是主要方法中初始化?

回答

17

如果使用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) 
    } 

} 
6

DelayedInit特征(这App扩展)导致intialisation重写代码在特殊的delayedInit()方法中执行。这通常将由main调用。但是,由于您优先于main,因此不会调用delayedInit()代码,因此您的值不会被初始化。

正如@tenshi所解释的,您可以通过不扩展App或将主代码移动到您的Main对象的主体中来解决此问题。