2012-06-22 27 views
8

Khi tôi sử dụng đặc tính scala App, tôi không thể in println hoạt động.Scala println không hoạt động với tính năng Ứng dụng

này đơn giản ví dụ in như mong đợi,

object HelloWorld { 
    def main(args: Array[String]) { 
    println("Hello, world!") 
    } 
} 

Nhưng một khi tôi giới thiệu các đặc điểm không,

object HelloWorld extends App { 
    println("Hello, world!") 
} 

tôi nhận được không có lỗi nhưng không in ra cửa sổ Console.

Trả lời

10

Bạn đã biên dịch nó trước (chạy scalac HelloWorld.scala)? Xem nhận xét này: http://www.scala-lang.org/node/9483#comment-40627

Được chỉnh sửa để thêm giải thích thêm: Phiên bản đầu tiên thực sự được biên soạn. Các tệp Scala không có phương thức chính rõ ràng được chạy chưa được biên dịch dưới dạng tập lệnh. Điều đó có nghĩa là đối với phiên bản thứ hai của bạn, các lệnh trong tệp được chạy tuần tự, như thể chúng đã được nhập vào trình thông dịch - vì vậy, đối tượng HelloWorld được tạo ra, nhưng không có phương thức nào được gọi trên nó. Có thêm thông tin về Scala là một ngôn ngữ kịch bản ở đây (di chuyển sang Bước 5): http://www.artima.com/scalazine/articles/steps.html

+0

Lạ. Điều đó có vẻ giống như một giới hạn kỳ lạ của người phiên dịch. Có lời giải thích nào tại sao tôi cần phải biên dịch lớp để làm cho nó hoạt động không? Những đặc điểm không làm việc trong thông dịch viên? –

+1

Và các đặc điểm hoạt động trong trình thông dịch, nhưng Ứng dụng là một trường hợp đặc biệt. Nó thường được trình bày là "Ứng dụng kết thúc mã bên trong đối tượng triển khai của nó trong một phương thức chính", nhưng nó không thực sự - thay vào đó, nó gắn mã đó vào cái gọi là delayInit, được gọi khi phương thức chính được gọi thay vì khi đối tượng được tạo ra, đó là bình thường khi mã trần bên trong một khai báo đối tượng được gọi. –

+0

Ah có ý nghĩa, cảm ơn cho lời giải thích. –

5

Thêm một dòng

object HelloWorld extends App { 
    /* code */ 
} 

HelloWorld.main(args) 

ở cuối tệp của bạn.

Lớp xác định phương thức nhưng cũng cần được gọi.