2013-08-11 9 views
5

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

क्या इसका कोई उपयोग है, जहां यह वास्तव में कोड को और अधिक पठनीय बनाता है?

cout << count(vec, [&](int a){ return a < x; }) << endl; // lambda 
cout << count(vec, Less_than<int> (x)) << endl;   // normal functor def-n 
+3

लैम्ब्डा संस्करण लंबा नहीं है। गैर-लैम्ब्डा अधूरा है, क्योंकि हमारे पास 'Less_than' की परिभाषा नहीं है। –

+0

वह कैसे है 'Less_than (x) 'a" सामान्य फ़ंक्शन परिभाषा "??? आपके पहले उदाहरण के आधार पर, ऐसा लगता है कि आपको 'x' के मान को दो-पैरामीटर तुलनित्र मज़ेदार को बांधना होगा, इसे एकल-पैरामीटर तुलनित्र में परिवर्तित करना होगा। यह पहले से ही कार्यक्षमता है जो "सामान्य कार्य परिभाषा" से काफी दूर है। – AnT

उत्तर

10

यह है क्योंकि यह सही जगह है जहाँ यह कहा जाता है में समारोह के कार्यान्वयन देता है, इस प्रकार कोड अपरिवर्तित के प्राकृतिक शीर्ष से नीचे प्रवाह रखने और अधिक पठनीय है।

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

तो, सामान्य कार्यों के गुणों का उचित लाभ उठाने के लिए, किसी को उन्हें अच्छी तरह से विचार-विमर्श, पूर्ण और पृथक अवशोषण लागू करने के लिए उपयोग करना चाहिए। इस तरह सामान्य कार्य कोड की पठनीयता में सुधार करेंगे।

लेकिन छोटे "डिस्पोजेबल" एक बार उपयोग यूटिलिटी कोड के लिए, सामान्य कार्य बहुत अच्छी तरह से काम नहीं करते हैं। वे वास्तव में कोड को काफी कम पठनीय बना सकते हैं। यह वह जगह है जहां लैम्ब्डा फ़ंक्शन आते हैं। वे उस डिस्पोजेबल यूटिलिटी कोड को सीधे कॉल के बिंदु में इंजेक्ट करने की अनुमति देते हैं, जहां यह आवश्यक है।

+0

एक अतिरिक्त बिंदु यह है कि लैम्ब्डा फ़ंक्शन सीधे वैरिएबल तक पहुंच सकते हैं जो मूल संदर्भ में दायरे में हैं (इस मामले में, उदाहरण के लिए, लैम्बडा सीधे "वीसी" तक पहुंच सकता है, उदाहरण के लिए।) यह उपयोग करने की उपयोगिता का हिस्सा नहीं है एक अलग समारोह बनाओ। –

1

लैम्ब्डा अभिव्यक्ति कोड को सरल बनाने के लिए मौजूद है। यह:

auto fun = []() { return; }; 

साथ संकलक द्वारा बदल दिया है:

// Namespace scope 
struct __lambda_1 { 
    void operator()() { return; } 
}; 

// local scope 
__lambda_1 fun{}; 

यह लैम्ब्डा वाक्य रचना के लिए प्राथमिक प्रेरणा है: पारंपरिक समारोह के लिए एक आसान के साथ वस्तुओं गुमनाम समारोह स्थल जहां पर घोषित कर दिया पढ़ने के लिए बदलने के लिए एक अलग कार्य वस्तु होने की बजाय इसकी आवश्यकता है, जिसे किसी अन्य दायरे में घोषित किया जाना चाहिए। यह नामित फ़ंक्शन ऑब्जेक्ट्स को प्रतिस्थापित करने के लिए नहीं है।

दरअसल, मानक पुस्तकालय में std::unary_function और std::less जैसी कई नामांकित फ़ंक्शन ऑब्जेक्ट्स शामिल हैं। लेकिन इन वस्तुओं में सीमित उपयोगिता है और लैम्ब्डा की हर संभावित भूमिका को नहीं ले सकता है।

तो, हाँ, यह कोड काफी अधिक पठनीय बना सकते हैं, कोड है कि मानक पुस्तकालय ठीक प्रदान नहीं करता है रखने, जहां यह आवश्यक है द्वारा आप नाम के साथ struct रों दर्जन लाइन के साथ अपने कोड को प्रदूषित करने और अपने नेमस्पेस को दूषित बिना ' शायद एक या दो बार से अधिक का उपयोग नहीं करेंगे।

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