स्केला में ऐप विशेषता और मुख्य विधि का उपयोग करने के बीच अंतर


87

दोनों के बीच क्या अंतर है

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

तथा

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


1
अपाचे स्पार्क नौकरियों के मामले में, प्रलेखन में कहा गया है कि "आवेदनों को scala.App बढ़ाने के बजाय एक मुख्य () विधि को परिभाषित करना चाहिए। scala.App के उपवर्ग सही ढंग से काम नहीं कर सकते हैं।"
leo9r

जवाबों:


64

एप्लिकेशन विशेषता एक निष्पादन योग्य स्कैला कार्यक्रम बनाने का एक सुविधाजनक तरीका है। मुख्य विधि altenative का अंतर है (स्पष्ट वाक्यात्मक अंतर के अलावा) जो कि अनुप्रयोग विशेषता विलंब टीकाकरण सुविधा का उपयोग करता है।

2.9 के लिए जारी नोट्स से ( http://www.scala-lang.org/old/node/9483 देखें )

इसके बजाय ऐप की विशेषता प्राप्त करने वाली वस्तुएं स्कैला 2.9 के विलंबित आरंभीकरण सुविधा का उपयोग करती हैं जो विरासत में मिली मुख्य विधि के हिस्से के रूप में पूरे शरीर को निष्पादित करती हैं।

ऐप योजना की एक और नई विशेषता यह है कि कमांड लाइन के तर्क अब आर्ग मूल्य के माध्यम से सुलभ हैं (जो कि ऐप से विरासत में मिला है)


मैं मेरी समझ में सही कर कि अनुप्रयोग विशेषता के लाभ के बिना, इस (एप्लिकेशन) वस्तु नहीं करता हूँ कार्य में है कि प्रवेश बिंदु है - किसी भी अन्य स्केला वस्तु की तरह mainविधि और शरीर के रूप में उम्मीद निष्पादित नहीं है। क्या मुख्य पर प्रवेश के बाद किसी बिंदु पर इसे निष्पादित किया जाता है?
रिचर्ड सीट्स

@RichardSitze में एक mainतरीका है कि Appआपकी पसंद की Applicationवस्तु को मिलाने वाली विशेषता है । इस तथ्य से परे कोई जादू नहीं है कि विलंबित आरंभीकरण आपकी Applicationवस्तु के शरीर को निष्पादित करता है ।
एमिल एच।

4

ये दो मामले स्केला स्क्रिप्टिंग पर समान नहीं हैं।

object extends App" scala MyObject.scala" कमांड द्वारा निष्पादित नहीं किया गया था , लेकिन मुख्य विधि वाले ऑब्जेक्ट को " scala MyObject.scala" कमांड द्वारा निष्पादित किया गया था । जिसे स्कैल्पिंग के लिए मुख्य विधि के साथ ऑब्जेक्ट की तलाश में स्कैला के रूप में वर्णित किया गया था।

ग्रहण के REPL या स्काला वर्कसेट का उपयोग करते समय, MyObject.main(Array[String]())दोनों मामलों के लिए स्पष्ट रूप से कॉल करने की आवश्यकता होती है।

यह सरल टिप मेरी तरह शुरुआती के लिए मददगार हो।


0

[[DelayedInit]] कार्यक्षमता का उपयोग करके एप्लिकेशन विशेषता को लागू किया जाता है, जिसका अर्थ है कि मुख्य विधि के निष्पादित होने से पहले ऑब्जेक्ट के फ़ील्ड को प्रारंभ नहीं किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.