Sự khác biệt giữa việc sử dụng đặc điểm ứng dụng và phương thức chính trong tỷ lệ


87

Sự khác biệt giữa

object Application extends App {
   println("Hello World")
}

object Application {
    def main(args: Array[String]): Unit = {
        println("Hello World");
    }
}


1
Trong trường hợp các công việc Apache Spark, tài liệu nói rằng "các ứng dụng nên xác định một phương thức main () thay vì mở rộng scala.App. Các lớp con của scala.App có thể không hoạt động chính xác."
leo9r

Câu trả lời:


64

Đặc điểm ứng dụng là một cách thuận tiện để tạo một chương trình scala có thể thực thi được. Sự khác biệt đối với phương thức thay đổi chính là (ngoài sự khác biệt rõ ràng về cú pháp) là đặc điểm Ứng dụng sử dụng tính năng sinh sản chậm.

Từ ghi chú phát hành cho 2.9 (xem http://www.scala-lang.org/old/node/9483 )

Các đối tượng kế thừa đặc điểm Ứng dụng thay vào đó sử dụng tính năng khởi tạo chậm trễ của Scala 2.9 để thực thi toàn bộ phần nội dung như một phần của phương thức chính được kế thừa.

Một tính năng mới khác của lược đồ Ứng dụng là các đối số dòng lệnh hiện có thể truy cập được thông qua giá trị args (được kế thừa từ Ứng dụng đặc điểm)


Tôi có đúng khi hiểu rằng nếu không có lợi ích của đặc điểm Ứng dụng, thì đối tượng (Ứng dụng) này không hoạt động giống như bất kỳ đối tượng scala nào khác - trong đó điểm vào là mainphương thức và phần thân không được thực thi như mong đợi. Nó có được thực thi tại một số thời điểm sau khi vào main không?
Richard Sitze

@RichardSitze Có một mainphương pháp mà Appphù thủy đặc điểm trộn lẫn vào Applicationđối tượng của bạn . Không có điều kỳ diệu nào xảy ra ngoài thực tế là quá trình khởi tạo bị trì hoãn là thứ thực thi phần thân của Applicationđối tượng của bạn .
Emil H

4

Hai trường hợp này không giống nhau trên tập lệnh scala.

object extends Appkhông được thực thi bởi scala MyObject.scalalệnh "", nhưng đối tượng chứa phương thức chính được thực thi bởi scala MyObject.scalalệnh "". Nó được mô tả là scala tìm kiếm đối tượng với phương thức chính để tạo kịch bản.

Khi sử dụng REPL hoặc tập quy mô của Eclipse, cần phải gọi MyObject.main(Array[String]())rõ ràng cho cả hai trường hợp.

Mẹo đơn giản này hữu ích cho người mới bắt đầu như tôi.


0

Đặc điểm ứng dụng được triển khai bằng chức năng [[DelayedInit]], có nghĩa là các trường của đối tượng sẽ không được khởi tạo trước khi phương thức chính được thực thi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.