स्केला का लागू () विधि जादू कैसे काम करता है?


79

स्काला में, यदि मैं applyकिसी वर्ग या शीर्ष-स्तरीय ऑब्जेक्ट में एक विधि को परिभाषित करता हूं, तो उस पद्धति को तब बुलाया जाएगा जब मैं किसी जोड़े को उस वर्ग के उदाहरण के लिए एक कोष्ठक संलग्न करूंगा, और apply()उनके बीच में उपयुक्त तर्क रखूंगा । उदाहरण के लिए:

class Foo(x: Int) {
    def apply(y: Int) = {
        x*x + y*y
    }
}

val f = new Foo(3)
f(4)   // returns 25

तो मूल रूप से, के object(args)लिए सिर्फ सिंथेटिक चीनी है object.apply(args)

स्काला इस रूपांतरण को कैसे करता है?

क्या पूर्वनिर्धारित वस्तु (लेकिन अलग तरह से) में निहित प्रकार के रूपांतरणों के समान ही विश्व स्तर पर परिभाषित अंतर्निहित रूपांतरण हो रहा है? या यह कुछ गहरा जादू है? मैं पूछता हूं क्योंकि ऐसा लगता है कि स्काला कई नियमों के साथ कई नियमों के बजाय नियमों के एक छोटे सेट के लगातार आवेदन का दृढ़ता से पालन करता है। यह शुरू में मेरे लिए अपवाद जैसा लगता है।


1
बहुत बढ़िया विवरण, stackoverflow.com/questions/9737352/#9738862
मुहम्मद Hewedy

जवाबों:


67

मुझे नहीं लगता कि आपके द्वारा मूल रूप से जो कहा गया है, उससे कहीं अधिक गहरा है: यह सिंटैक्टिक शुगर है जिससे कंपाइलर एक विशेष सिंटैक्स केस के रूप f(a)में परिवर्तित हो f.apply(a)जाता है।

यह एक विशिष्ट नियम की तरह लग सकता है, लेकिन इनमें से केवल कुछ (उदाहरण के लिए, update) डीएसएल -जैसे निर्माणों और पुस्तकालयों के लिए अनुमति देता है ।


4
मैं "जब fकोई वस्तु (कार्यों सहित)" जोड़ूंगा। जब fकोई विधि होती है, तो जाहिर तौर पर ऐसा कोई अनुवाद नहीं होता है।
एलेक्सी रोमानोव

2
@AlexeyRomanov: ठीक है, अगर fएक विधि है जिसे एक पैरामीटर सूची के बिना परिभाषित किया गया है, तो f(a)वास्तव में कुछ इस तरह व्याख्या की जाती है val _tmp = f; _tmp.apply(a)। लेकिन यह वास्तव में बंटवारे के बाल क्षेत्र में मजबूती से हो रहा है।
जोर्ग डब्ल्यू मित्तग

20

यह वास्तव में दूसरा तरीका है, किसी वस्तु या वर्ग के साथ लागू विधि एक सामान्य स्थिति है और एक फ़ंक्शन विधि के साथ समान नाम की वस्तु का निर्माण करने का एक तरीका है। वास्तव में आपके द्वारा परिभाषित प्रत्येक फ़ंक्शन, फ़ंक्शन n विशेषता का एक उप-विषय है (n तर्क की संख्या है)।

अनुभाग देखें समारोह आवेदन: 6.6 की स्काला भाषा विशिष्टता विषय की अधिक जानकारी के लिए।


स्काला भाषा विनिर्देश बदलने के लिए +1। मैंने सही स्थान जोड़ा है क्योंकि आपकी पृष्ठ संख्या पुरानी है।
अलेक्जेंड्रे मार्टिन्स

8

मैं पूछता हूं क्योंकि ऐसा लगता है कि स्काला कई नियमों के साथ कई नियमों के बजाय नियमों के एक छोटे सेट के लगातार आवेदन का दृढ़ता से पालन करता है।

हाँ। और यह नियम इस छोटे सेट के अंतर्गत आता है।

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