2015-08-13 6 views
16

क्या कोई इस पर कुछ अंतर्दृष्टि प्रदान कर सकता है? क्या लैम्ब्डा बाहरी चर को कैप्चर कर रहा है, या लैम्बडा द्वारा उत्पादित बाहरी दुनिया को कैप्चरिंग मूल्य है? एक निश्चित चर के कब्जे के लिए इसका क्या अर्थ है?लैम्बडास के संदर्भ में शब्द कैप्चर का क्या अर्थ है?

+0

मुझे समझ नहीं नहीं आप * द्वारा क्या मतलब है या बाहर की दुनिया lambdas * द्वारा उत्पादित मूल्यों पर कब्जा है, लेकिन हो सकता है [इस] (https://stackoverflow.com/a/23499673/241631) जवाब आपका प्रश्न। – Praetorian

+0

इसका शाब्दिक अर्थ है कि कार्य के दायरे में ऑब्जेक्ट्स (या ऑब्जेक्ट्स के संदर्भ) की प्रतिलिपि बनाना है। समारोह सचमुच * उस वातावरण के हिस्से को कैप्चर करता है जहां से इसे बनाया गया था। यह इसे संचालित करने के लिए संदर्भ डेटा देता है। – Galik

उत्तर

13

लैम्ब्डा बाहरी चर को कैप्चर कर रहा है।

एक लैम्ब्डा कक्षा बनाने के लिए एक वाक्यविन्यास है। एक चर को कैप्चर करना मतलब है कि उस वर्ग के लिए परिवर्तक को चर भेजा जाता है।

एक लैम्ब्डा निर्दिष्ट कर सकता है कि यह संदर्भ या मूल्य द्वारा पारित किया गया है या नहीं। उदाहरण के लिए:

[&] { x += 1; }  // capture by reference 
[=] { return x + 1; } // capture by value 

पहले मोटे तौर पर इस तरह एक वर्ग का उत्पादन:

class bar { 
    int x; 
public: 
    bar(int x) : x(x) {} 
    int operator()() const { return x + 1; } 
}; 

संदर्भ के ज़्यादातर उपयोग के साथ के रूप में, पर कब्जा:

class foo { 
    int &x; 
public: 
    foo(int &x) : x(x) {} 
    void operator()() const { x += 1; } 
}; 

दूसरा इस तरह एक वर्ग कुछ का उत्पादन संदर्भ द्वारा एक लापरवाह संदर्भ बना सकता है अगर बंद (लैम्ब्डा अभिव्यक्ति द्वारा बनाई गई कक्षा का उद्देश्य) कैप्चर की गई वस्तु को बाहर करता है।

+1

"एक लैम्ब्डा कक्षा बनाने के लिए एक वाक्यविन्यास है।" जरुरी नहीं। – CoffeeandCode

+0

@CoffeeandCode: ओह? विकल्प क्या हैं? –

+3

'[]() {/ * ... शरीर ... * /}' एक सादे फ़ंक्शन पॉइंटर 'शून्य (*)() 'में परिवर्तनीय है, इसलिए इसे एक मुक्त-स्थायी कार्य के रूप में कार्यान्वित किया जा सकता है। वैसे भी, संकलक कैप्चरिंग-लैम्बडास के लिए सभी प्रकार की चालबाजी कर सकता है। यह उन कार्यों को परिभाषित कर सकता है जो स्थानीय चरों पर पॉइंटर्स लेते हैं और उन्हें कैप्चर करने के लिए अपमानित करते हैं। यह कुछ मामलों में लैम्बडास बॉडी में 'int x =/* कैप्चर वैल्यू */'को जोड़ सकता है। 'ऑपरेटर()() 'के साथ कक्षा के अलावा इसे लागू करने के कई तरीके हैं। यह वास्तव में कार्यान्वयन के लिए है। – CoffeeandCode

2

लैम्ब्डा वेरिएबल्स को कैप्चर करता है जो अन्यथा इसका उपयोग नहीं करेंगे। कोई निर्दिष्ट कर सकता है कि कैसे एक लैम्ब्डा को एक चर .i.e मान, संदर्भ कैप्चर करना चाहिए। यह वास्तव में अच्छी तरह से समझाया गया है यहाँ In lambda functions syntax, what purpose does a 'capture list' serve?

6

जेरी ताबूत आप विस्तृत प्रतिक्रिया दी, मैं मानता हूँ कि लैम्ब्डा एक class.There बनाने के लिए वाक्य रचना है जिस तरह से चर के बारे में विकल्पों में से गुच्छा कब्जा कर लिया और कर रहे हैं विकल्पों में से how.List:

[] Capture nothing (or, a scorched earth strategy?) 
[&] Capture any referenced variable by reference 
[=] Capture any referenced variable by making a copy 
[=, &foo] Capture any referenced variable by making a copy, but capture variable foo by reference 
[bar] Capture bar by making a copy; don't copy anything else 
[this] Capture the this pointer of the enclosing class 
संबंधित मुद्दे