2012-01-31 24 views
18

私はいくつかのコードがあります:NameTemplate mainメソッド内で初期化されていないのはなぜスカラ座のAppヴァル・初期化

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

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

を?

答えて

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で引数にアクセスすることもできます。 intialisationの書き換えせる(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を拡張したくない場合はmainメソッドを記述する必要があるが、この場合にはそれが期待どおりに動作します特定のdelayedInit()メソッド内で実行するコード。これは、通常、mainによって呼び出されます。ただし、mainをオーバーライドしているため、delayedInit()コードが呼び出されることはありません。そのため、値が初期化されていません。

@tenshiが説明しているように、Appを拡張しないか、メインコードをMainオブジェクトの本体に移動することで回避できます。