Scala App val инициализация в основном методе - PullRequest
19 голосов
/ 31 января 2012

У меня есть код:

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

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

Почему NameTemplate не инициализируется в основном методе?

Ответы [ 2 ]

19 голосов
/ 31 января 2012

Если вы используете черту 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 голосов
/ 31 января 2012

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

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

...