2010-07-02 5 views
6

क्या सी ++ और जावा के संदर्भ में लैम्ब्डा अभिव्यक्ति की मेरी व्याख्या सही है?सी ++ 0x - लैम्ब्डा अभिव्यक्ति जावा की अनाम आंतरिक कक्षा के समान दिखती है?

+2

संयोग से, लैम्ब्डा अभिव्यक्तियों को जावा 7 में शामिल करने के लिए नेतृत्व किया जाता है। Http://openjdk.java.net/projects/lambda/ – Gunslinger47

उत्तर

5

वे काफी समान नहीं हैं। दोनों अज्ञात वर्ग बनाते हैं, लेकिन उनकी समानता उस बिंदु पर समाप्त होती है।

सी ++ में आप वैकल्पिक रूप से संदर्भ द्वारा अपने स्थानीय चर को पकड़ने का बंद कर देते हैं। जावा में, आपको बस वर्तमान स्थानीय चर के मानों का एक स्नैपशॉट मिलता है (और उन चरों को "अंतिम" होना चाहिए)।

गुमनाम आंतरिक कक्षाओं का उद्देश्य किसी अन्य वर्ग का विस्तार करना या किसी अन्य इंटरफ़ेस विज्ञापन-क्रिया को लागू करना है। इसी कारण से, अनाम आंतरिक कक्षाएं कुछ विस्तार के लिए लैम्ब्डा अभिव्यक्तियों के काम को अनुकरण कर सकती हैं, उदाहरण के लिए Runnable इंटरफ़ेस को कार्यान्वित करके। लैम्ब्डा अभिव्यक्तियों को विशेष रूप से बुलाया जाने और उनके पर्यावरण में स्थानीय चर को संशोधित करने के लिए डिज़ाइन किया गया है।

+0

दायरे में चरों को एक्सेस करने के अलावा, कोई अंतर नहीं है? – yesraaj

+1

@yesraaj, मुझे आंतरिक कक्षाओं के बहुत विवरणों के बारे में पता नहीं है। लेकिन चूंकि उद्देश्य पूरी तरह से अलग है, मुझे लगता है कि हम सैनी विधियों का उपयोग करके उनकी तुलना नहीं कर सकते हैं। गुमनाम आंतरिक कक्षाओं में, जो आप शरीर में निर्दिष्ट करते हैं उसे उत्पन्न अज्ञात वर्ग निकाय में कॉपी किया जाता है। तो आप कई विधियों, कक्षा के सदस्यों, आदि जोड़ सकते हैं .. C++ lambdas के लिए, आप बस "ऑपरेटर()" की सामग्री निर्दिष्ट करते हैं। –

+0

+1। एक साइड नोट के रूप में, सी # अपने स्वयं के लैम्बडास के साथ बंद होने की समस्या के लिए एक और अलग दृष्टिकोण प्रदान करता है जो हमेशा सभी स्थानीय चर के संदर्भ में कैप्चर करता है। आप जॉन स्कीट के ब्लॉग में [क्लोजर ऑफ़ द क्लोजर] (http://csharpindepth.com/Articles/Chapter5/Closures.aspx) में जावा/सी # के बारे में पढ़ सकते हैं। यह लेख सी ++ लैम्बडास से निपटता नहीं है, जहां आप या तो मूल्य या संदर्भ द्वारा कैप्चर कर सकते हैं, लेकिन सी ++ में अधिकांश अन्य मामलों में, आपको अपने कब्जे वाले संदर्भों के जीवनकाल से सावधान रहना चाहिए - संदर्भ के बाद लैम्ब्डा का उपयोग नहीं किया जाना चाहिए वस्तुओं को नष्ट कर दिया गया है। –

2

C++ 0x लैम्ब्डा भाव अनाम तरीकों, Javas गुमनाम वर्गों अनाम कक्षाओं कर रहे हैं। इसलिए वे एक नाम नहीं साझा करते हैं लेकिन अवधारणाएं अलग हैं।

सबसे स्पष्ट तथ्य से शुरू करना, कि लैम्ब्डा फ़ंक्शंस (मई) एक मूल्य लौटा सकता है और अज्ञात वर्गों का उपयोग उदाहरण (ऑब्जेक्ट्स) बनाने के लिए किया जा सकता है।

बीटीडब्ल्यू - wikipedia उल्लेख है कि केवल lambda फ़ंक्शंस सी ++ 0x के लिए प्रस्तावित हैं।

+0

शब्द विधि का उपयोग करके थोड़ा याद आती है, लैम्ब्डा अभिव्यक्ति अज्ञात विधियां नहीं हैं वे अज्ञात कार्य हैं । –

+0

@snk_kid: सी ++ में, वे वही बात हैं। कक्षा कार्य सदस्य विधियां हैं। – Puppy

+0

@DeadMG इंस्टेंस विधियां फ़ंक्शन के समान नहीं हैं, खासकर स्मॉलटॉक और ऑब्जेक्टिव-सी जैसी भाषाओं के शब्द के पारंपरिक/मूल अर्थ में। तरीके ओओ शब्दावली हैं, वे लैम्ब्डा कैलकुस या कार्यात्मक प्रोग्रामिंग शब्दावली नहीं हैं, हस्केल या एसएमएल जैसी कार्यात्मक भाषाओं में कोई 'विधियां' नहीं हैं। इसलिए जैसा कि मैंने कहा है कि शब्द विधि का उपयोग करना भ्रामक और गलत है। –

4

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

एक C++ लैम्ब्डा संलग्नित समारोह में करने के लिए सभी डेटा (परिवर्तनशील सहित) का उल्लेख कर सकते, और अगर यह एक सदस्य समारोह के अंदर नेस्टेड है तो यह संलग्नित क्लास के डेटा के लिए भी ऐसा ही कर सकते हैं। संलग्नक स्कोप (ओं) पर निर्भरता की सटीक डिग्री प्रोग्रामर द्वारा घोषित की जाती है, इसलिए यह स्पष्ट के बजाय स्पष्ट है।

यह उन्हें काफी समान बनाता है लेकिन जावा सुविधा अलग-अलग तरीकों से स्थानीय चर/पैरामीटर को अलग-अलग तरीके से मानती है, इस सिद्धांत पर कि उन्हें विधि के बाहर से उत्परिवर्तनीय नहीं होना चाहिए, विशेष रूप से ऐसी भाषा में जो पारंपरिक रूप से थ्रेडिंग को इतनी आकस्मिक रूप से नियोजित करता है।

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

+0

ग्रीट उत्तर।क्या आपके पास कोई विशिष्ट संसाधन है, जिसका उपयोग मैं जावा लैम्ब्डा कार्यों के विवरण (और शायद कार्यान्वयन) को जानने के लिए कर सकता हूं? –

संबंधित मुद्दे