Perbedaan antara menggunakan sifat Aplikasi dan metode utama dalam skala


87

Apa perbedaan antara

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

dan

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


1
Dalam kasus tugas Apache Spark, dokumentasi menyatakan "bahwa aplikasi harus menetapkan metode main () daripada memperluas scala.App. Subkelas scala.App mungkin tidak bekerja dengan benar."
leo9r

Jawaban:


64

Sifat Aplikasi adalah cara mudah untuk membuat program skala yang dapat dieksekusi. Perbedaan dengan metode altenatif utama adalah (terlepas dari perbedaan sintaksis yang jelas) bahwa sifat Aplikasi menggunakan fitur initalisasi tertunda.

Dari catatan rilis untuk 2.9 (lihat http://www.scala-lang.org/old/node/9483 )

Objek yang mewarisi sifat Aplikasi malah menggunakan fitur inisialisasi tertunda Scala 2.9 untuk mengeksekusi seluruh isi sebagai bagian dari metode utama yang diwariskan.

Fitur baru lainnya dari skema Aplikasi adalah argumen baris perintah sekarang dapat diakses melalui nilai argumen (yang diwarisi dari App sifat)


Apakah saya benar dalam pemahaman saya bahwa tanpa manfaat dari sifat Aplikasi, objek (Aplikasi) ini tidak bertindak seperti objek skala lainnya - di mana titik masuknya adalah mainmetode dan badan tidak dieksekusi seperti yang diharapkan. Apakah itu dieksekusi di beberapa titik setelah masuk ke utama?
Richard Sitze

@RichardSitze Ada mainmetode di mana Apppenyihir bisa dicampur ke Applicationobjek Anda . Tidak ada keajaiban yang terjadi di luar fakta bahwa inisialisasi yang tertunda adalah yang mengeksekusi tubuh Applicationobjek Anda .
Emil H

4

Kedua kasus ini tidak sama pada skrip scala.

object extends App" scala MyObject.scala" tidak dieksekusi oleh perintah " ", tetapi objek yang berisi metode utama dieksekusi dengan scala MyObject.scalaperintah " ". Yang digambarkan sebagai scala mencari objek dengan metode utama untuk pembuatan skrip.

Saat menggunakan REPL atau scala workseet dari Eclipse, perlu memanggil MyObject.main(Array[String]())secara eksplisit untuk kedua kasus.

Tip sederhana ini bermanfaat bagi pemula seperti saya.


0

Sifat aplikasi diimplementasikan menggunakan fungsionalitas [[DelayedInit]], yang berarti bahwa bidang objek tidak akan diinisialisasi sebelum metode utama dijalankan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.