2012-01-31 31 views
18

Tengo algo de código:Scala App val inicialización en el método principal

object Main extends App 
{ 
    val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r 

    override def main (args:Array[String]) 
    { 
     // Why is NameTemplate null here? 
    } 
} 

¿Por qué se NameTemplate no inicializado en el principal método?

Respuesta

17

Si está utilizando App rasgo, entonces no es necesario para anular main método - acaba de escribir el código en el cuerpo de la 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) 

} 

Funciona porque App rasgo se extiende DelayedInit rasgo que tiene procedimiento de inicialización muy especial. Incluso puede acceder a argumentos con args, como se muestra en el ejemplo.

Todavía es necesario escribir main método si no desea extender App, pero en este caso se ponga a funcionar como se esperaba:

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

El DelayedInit rasgo (que se extiende App) hace que la reescritura de intialisation código para ejecutar dentro de un método especial delayedInit(). Esto normalmente sería invocado por main. Sin embargo, dado que está anulando main, nunca se invoca el código delayedInit(), y como tal, su valor no se inicializa.

Como explica @tenshi, puede evitar esto extendiendo App o moviendo su código principal al cuerpo de su objeto Main.

Cuestiones relacionadas