Ölçeklendirmede Uygulama özelliğini kullanma ile ana yöntemi kullanma arasındaki fark


87

Arasındaki fark nedir

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

ve

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


1
Apache Spark işleri durumunda, dokümantasyon "uygulamaların scala.App'i genişletmek yerine bir main () yöntemi tanımlaması gerektiğini belirtir. Scala.App alt sınıfları düzgün çalışmayabilir."
leo9r

Yanıtlar:


64

Uygulama özelliği, çalıştırılabilir bir ölçekleme programı oluşturmanın uygun bir yoludur. Altenatif ana yöntemin farkı (bariz sözdizimsel farklılıklardan ayrı olarak), Uygulama özelliğinin gecikmeli başlatma özelliğini kullanmasıdır.

2.9 sürüm notlarından (bkz. Http://www.scala-lang.org/old/node/9483 )

Uygulama özelliğini devralan nesneler bunun yerine Scala 2.9'un gecikmeli başlatma özelliğini kullanarak tüm gövdeyi miras alınan ana yöntemin bir parçası olarak yürütür.

Uygulama şemasının bir başka yeni özelliği de komut satırı argümanlarına artık args değeri (trait App'ten miras alınan) aracılığıyla erişilebilir olmasıdır.


Anladığım kadarıyla, Uygulama özelliğinin yararı olmadan, bu (Uygulama) nesnesinin başka herhangi bir ölçek nesnesi gibi davranmadığını - giriş noktasının mainyöntem olduğu ve gövdenin beklendiği gibi çalıştırılmadığı konusunda haklı mıyım? Main'e girdikten sonra bir noktada yürütüldü mü?
Richard Sitze

@RichardSitze cadı özelliğinde nesnenize karıştırılan bir mainyöntem Appvar Application. Gecikmeli başlatmanın Applicationnesnenizin gövdesini yürüten şey olduğu gerçeğinin ötesinde hiçbir sihir yoktur .
Emil H

4

Bu iki durum, scala komut dosyasında aynı değildir.

object extends App" scala MyObject.scala" komutuyla çalıştırılmadı , ancak ana yöntemi içeren nesne " scala MyObject.scala" komutuyla çalıştırıldı . Bu, komut dosyası oluşturmak için ana yöntemle nesne arayan skala olarak tanımlandı.

REPL veya Eclipse'in ölçekleme çalışma setini kullanırken, MyObject.main(Array[String]())her iki durum için de açıkça çağırmanız gerekir .

Bu basit ipucu benim gibi yeni başlayanlar için faydalı olacaktır.


0

Uygulama özelliği, [[DelayedInit]] işlevselliği kullanılarak gerçekleştirilir; bu, nesnenin alanlarının ana yöntem çalıştırılmadan önce başlatılmayacağı anlamına gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.