2012-01-31 2 views

ответ

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

The DelayedInit черта (которая App расширяющий) вызывает перезапись intialisation код для выполнения в рамках специального метода delayedInit(). Обычно это будет вызвано main. Однако, поскольку вы переопределяете main, код delayedInit() никогда не вызывается, и поэтому вы не инициализируетесь.

Как объясняет @tenshi, вы можете обойти это, не расширив App или переместив основной код в тело вашего объекта Main.

Смежные вопросы