2012-01-31 24 views
18

Tôi có một số mã:Scala App val khởi tạo trong phương pháp chính

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

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

Tại sao NameTemplate không được khởi tạo trong phương pháp chính?

Trả lời

17

Nếu bạn đang sử dụng App đặc điểm, sau đó bạn không cần phải ghi đè main phương pháp - chỉ cần viết mã của bạn trong cơ thể của 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) 

} 

Nó hoạt động vì App đặc điểm mở rộng DelayedInit đặc điểm trong đó có thủ tục khởi tạo rất đặc biệt. Bạn thậm chí có thể truy cập các đối số với args, như được hiển thị trong ví dụ.

Bạn vẫn cần phải viết main phương pháp nếu bạn không muốn mở rộng App, nhưng trong trường hợp này nó sẽ làm việc như mong đợi:

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

Các DelayedInit đặc điểm (mà App kéo dài) gây viết lại của intialisation để thực thi trong một phương thức đặc biệt delayedInit(). Điều này sau đó thường được gọi bởi main. Vì bạn đang ghi đè main, tuy nhiên, mã delayedInit() không bao giờ được gọi và do đó giá trị của bạn không được khởi tạo.

Khi @tenshi giải thích, bạn có thể giải quyết vấn đề này bằng cách không mở rộng App hoặc bằng cách di chuyển mã chính của bạn vào phần đối tượng Main của bạn.

Các vấn đề liên quan