दिलचस्प पोस्ट
पायथन तार अपरिवर्तनीय नहीं हैं? PHP को बहुआयामी सरणी से डुप्लिकेट मान हटाएं Textarea एक इनपुट क्यों नहीं है? सी ++ में एक्सएमएल उत्पन्न करने का सबसे आसान तरीका क्या है? कैसे php में चरित्र 65279 गूंज से बचने के लिए? (यह प्रश्न भी जावास्क्रिप्ट xmlhttp.responseText (AJAX) से संबंधित है) कैसे पावरशेल्ड का उपयोग कर एक शॉर्टकट बनाने के लिए यूडब्ल्यूएसजीआई, फ्लास्क, स्काल्लैमी, और पोस्टग्रेज़: SSL त्रुटि: डिक्रिप्शन विफल या खराब रिकॉर्ड मैक कोणीय – वादे बनाम अवलोकन NHibernate इएसशन फ्लश: इसका उपयोग कब और कब किया जाए, और क्यों? एक स्ट्रिंग लौटने के लिए एक मौजूदा PHP फ़ंक्शन को संशोधित करें जावास्क्रिप्ट देरी फ़ंक्शन कैसे बनाएं पायथन: अधिकतम पुनरावर्ती गहराई से अधिक हो गई कैसे एक std :: स्ट्रिंग और int जोड़ने के लिए? खाली सूची में क्यों असाइन नहीं किया जा रहा है (जैसे = "") एक त्रुटि? <H: ग्राफिक इमेज> या <img> टैग का उपयोग करके वेबएप / वेबकोनटेक्स्ट / परिनियोजन फ़ोल्डर से बाहर चित्र लोड करें

स्कला में कार्य बनाम तरीके

मैं रनर बजरनसन को शुरुआती दिनों के लिए कार्यात्मक प्रोग्रामिंग देख रहा हूं, और 14:45 पर वह एक विधि को परिभाषित करता है:

def isDivisibleBy(k: Int): Int => Boolean = i => i % k == 0 

और एक फ़ंक्शन:

 val isEven = isDivisibleBy(2) 

एक विधि के बजाय एक फ़ंक्शन के रूप में परिभाषित करने के पेशेवर और विपक्ष क्या हैं?

मैंने स्कला फ़ंक्शंस बनाम मेथड्स पढ़ा है और स्काला में विधि और फ़ंक्शन के बीच अंतर भी है , और मैं सिमेंटिक अंतर को समझता हूं, लेकिन मुझे आश्चर्य है कि इस मामले में कुछ गहरा कारण है कि कोई फ़ंक्शन किसी पद्धति का उपयोग करने के लिए बेहतर क्यों नहीं हो सकता है या नहीं:

 def isEven = isDivisibleBy(2) 

Solutions Collecting From Web of "स्कला में कार्य बनाम तरीके"

हुड के तहत, फ़ंक्शंस और विधियों के बीच अन्य अंतर हैं। आम तौर पर, एक सादा विधि एक फ़ंक्शन (जो तकनीकी रूप से एक apply विधि के साथ एक ऑब्जेक्ट है) से कम उपरि उत्पन्न करती है।

हालांकि, अगर आप उन अंतरों की परवाह नहीं करते हैं और def , val और var में अलग-अलग शब्दों के साथ खेत के बारे में सोचते हैं, तो यह केवल यह है कि def हर बार इसका मूल्यांकन करता है जब val केवल एक बार मूल्यांकन करता है

इसलिए, एक val isEven = isDivisibleBy(2) को बुलाया जाना चाहिए isDivisibleBy(2) इसकी परिभाषा के दौरान और isDivisibleBy(2) का परिणाम असाइन करें। उदाहरण के लिए यह k में जगह लेता है

 def isDivisibleBy(k: Int): Int => Boolean = i => i % k == 0 

2 साथ और अंतिम अभिव्यक्ति के परिणाम को निर्दिष्ट करता है (इस मामले में केवल एक अभिव्यक्ति है):

 val isEven: Int => Boolean = i => i % 2 == 0 

def isEven भी है दूसरी तरफ कोई ऐसा मूल्यांकन नहीं करता है और इसके परिणामस्वरूप किसी कॉल में डिविज़िबिल (2) हर बार होता है

इसका मतलब है कि, बाद में, जब आप कोड निष्पादित करते हैं, isEven(11) एक val मामले में उत्पन्न करता है

 11 % 2 == 0 

और एक def मामले में, आपके पास होगा

 isDivisibleBy(2)(11) 

और मूल्यांकन करने के बाद ही isDivisibleBy आप परिणाम प्राप्त करेंगे।

आप डिबग करने के लिए कुछ डीबग कोड जोड़ सकते हैं अंतर देखने के लिए:

 def isDivisibleBy(k: Int): Int => Boolean = { println("evaluating isDivisibleBy") i => i % k == 0 } 

मैं यहाँ एक अन्य बिंदु को संबोधित करना चाहता हूं। यह एक विधि के रूप में भी परिभाषित करता है:

 def isEven = isDivisibleBy(2) 

और यह परिभाषित करता है एक विधि के रूप में भी:

 val isEven = isDivisibleBy(2) 

दोनों ही मामलों में, यह भी एक विधि है, जिसे बुलाया जाता है, फ़ंक्शन वापस करता है।

पहले मामले में, isDivisible(2) को हर बार कहा जाता है isEven भी कहा जाता है उदाहरण के लिए, यह कॉल isDivisible(2) तीन बार है:

 def isEven = isDivisibleBy(2) List(1,2,3).filter(isEven) 

दूसरे मामले में, isDivisible(2) को एक बार कहा जाता है (निर्माण समय पर, या जब एक परिभाषा में उस पंक्ति को निष्पादित किया जाता है), और उस मूल्य को हर बार पुनः प्राप्त किया जाता है भी कहा जाता है निम्न उदाहरण कॉल isDivisible(2) एक बार केवल:

 val isEven = isDivisibleBy(2) List(1,2,3).filter(isEven) 

मुझे लगता है कि फ़ंक्शन को परिभाषित करने के मुख्य समर्थक भी हैं, क्योंकि val दर्शकों को दिखा रहा है कि फ़ंक्शन को इस तरह परिभाषित किया जा सकता है। तो यह स्पष्ट है, कि फ़ंक्शन सिर्फ एक वस्तु है जो स्कला में सब कुछ है। लेकिन गैर-प्रदर्शनकारी प्रोग्रामिंग की दुनिया में, कार्यों को लिखने की कोई आवश्यकता नहीं है क्योंकि val एस।

विधि def isDivisibleBy(k: Int): Int => Boolean एक फ़ंक्शन देता है जो एक Int ( i ) पैरामीटर के रूप में लेता है और एक बूलियन ( i % k == 0 ) देता है।

val isEven = isDivisibleBy(2) दूसरी तरफ एक ऐसा क्षेत्र है जिसमें समारोह द्वारा दिया जाता है isDivisibleBy(2) संग्रहीत है। यदि आप वैर के बजाय def उपयोग करते हैं तो द्विश्याशील विधि को हर बार कहा जाता है कि वह विधि भी कहा जाता है, लेकिन अब इसे केवल एक बार कहा जाता है और परिणाम क्षेत्र में जमा हो जाता है।

आप def isEven(i: Int): Boolean = i % 2 == 0 लिखकर एक ही परिणाम प्राप्त कर सकते हैं def isEven(i: Int): Boolean = i % 2 == 0

मुझे लगता है कि उदाहरण का मतलब यह है कि आप ऐसे फ़ंक्शंस रख सकते हैं जो अन्य कार्यों को वापस लाते हैं, और आप फ़ंक्शन को ऑब्जेक्ट के रूप में स्टोर कर सकते हैं, और फिर उन्हें कॉल करें जैसे कि वे परंपरागत रूप से परिभाषित विधियां हैं उपरोक्त कोड भी करीने के समान है, इसलिए यह उदाहरण द्वारा प्रदर्शित एक वस्तु भी हो सकता है (हालांकि यह कतरने के लिए स्काला की वाक्यविन्यास का उपयोग नहीं करता है)।