ब्लॉक Ruby का इतना महत्वपूर्ण हिस्सा हैं, उनके बिना भाषा की कल्पना करना कठिन है। लेकिन लैम्ब्डा? कौन लैम्ब्डा से प्यार करता है? आप वर्षों तक बिना एक का उपयोग किए जा सकते हैं। वे लगभग एक बीते युग के अवशेष लगते हैं।
...लेकिन यह पूरी तरह सच नहीं है। लैम्ब्डा की आस्तीन में कुछ दिलचस्प तरकीबें हैं एक बार जब आप उनकी थोड़ी जांच करते हैं।
इस आर्टिकल में हम लैम्ब्डा उपयोग की मूल बातों से शुरू करेंगे, और फिर कुछ अधिक दिलचस्प उन्नत उपयोगों पर जाएंगे। इसलिए यदि आप हर दिन लैम्ब्डा का उपयोग करते हैं और उनके बारे में सब जानते हैं, तो बस नीचे स्क्रॉल करें।
लैम्ब्डा के बारे में याद रखने वाली मुख्य बात यह है कि वे फ़ंक्शन की तरह व्यवहार करते हैं। ब्लॉक्स और Procs के अपने उपयोग हैं। लेकिन उनमें से कोई भी 100% वास्तविक जीवन फ़ंक्शन की तरह व्यवहार नहीं करता। लैम्ब्डा करते हैं। आइए सूची देखें।
लैम्ब्डा सही संख्या में आर्गुमेंट लागू करते हैं
Procs के विपरीत, लैम्ब्डा सही संख्या में आर्गुमेंट लागू करते हैं
लैम्ब्डा डिफ़ॉल्ट आर्गुमेंट का समर्थन करते हैं
नीचे दिए गए उदाहरण में, हम "hello world" के डिफ़ॉल्ट आर्गुमेंट मान के साथ एक लैम्ब्डा फ़ंक्शन बनाते हैं
लैम्ब्डा डिफ़ॉल्ट आर्गुमेंट का समर्थन करते हैं
return कीवर्ड ठीक वैसे ही काम करता है जैसा आप उम्मीद करेंगे।
शायद यह एक छोटी बात लगती है, लेकिन अगर आपने कभी Proc के अंदर return का उपयोग करने की कोशिश की है तो आप जानते हैं कि यह नहीं है।
नीचे दिया गया उदाहरण आपको दिखाएगा कि मेरा क्या मतलब है। मैंने `something` नामक एक मेथड परिभाषित किया है जो एक `Proc` को कॉल करता है। `Proc` में एक return स्टेटमेंट है। लेकिन वह return स्टेटमेंट ट्रिकी है। केवल Proc से वापस आने के बजाय, यह something मेथड से वापस आता है।
लेकिन जब मैं `lambda` के साथ कुछ समान करता हूँ, तो `return` स्टेटमेंट केवल लैम्ब्डा से वापस आता है। यह किसी अन्य फ़ंक्शन की तरह ही है।
जब आप लैम्ब्डा के अंदर return कीवर्ड का उपयोग करते हैं, तो यह लैम्ब्डा से वापस आता है
लैम्ब्डा क्लोजर हैं
एक महान स्टैक ओवरफ्लो पोस्ट को उद्धृत करने के लिए:
क्लोजर के बारे में सोचने का सबसे सरल तरीका एक **फ़ंक्शन है जिसे वेरिएबल के रूप में संग्रहीत किया जा सकता है** ("फर्स्ट-क्लास फ़ंक्शन" के रूप में संदर्भित), जिसमें उस स्कोप में स्थानीय अन्य वेरिएबल्स तक पहुंचने की विशेष क्षमता होती है जिसमें इसे बनाया गया था।
इसका क्या मतलब है कि उस स्कोप में स्थानीय अन्य वेरिएबल्स तक पहुंचने में सक्षम होना जिसमें लैम्ब्डा बनाया गया था? आइए देखें। नीचे दिए गए उदाहरण में मैंने `marco` नामक एक स्थानीय वेरिएबल बनाया है। मैं उस वेरिएबल को अपने लैम्ब्डा के अंदर उपयोग कर सकता हूँ। और यदि मैं उस वेरिएबल में मान बदलता हूँ, तो लैम्ब्डा नया मान देखता है।
Ruby लैम्ब्डा क्लोजर हैं
लैम्ब्डा गिरगिट हैं
लैम्ब्डा के बारे में वास्तव में अजीब चीजों में से एक उन्हें कॉल करने के तरीकों की विविधता है। नीचे दिया गया सैंपल लैम्ब्डा को इनवोक करने के तीन तरीके दिखाता है। वे सभी समतुल्य हैं।
Ruby में लैम्ब्डा को इनवोक करने के कम से कम तीन तरीके हैं
शायद यह आपको थोड़ा अजीब लगता है। मुझे भी पहले ऐसा लगा था। और ईमानदारी से `l.(arg)` सिंटैक्स अभी भी मुझे चकरा देता है। लेकिन `l[arg]` सिंटैक्स काफी दिलचस्प है। इसका मतलब है कि सीमित सीमा तक आप लैम्ब्डा का उपयोग उन स्थानों पर कर सकते हैं जहां आप सामान्य रूप से एक सरणी या हैश का उपयोग करेंगे।
लैम्ब्डा को कंप्यूटेड हैश और सरणियों के रूप में उपयोग करना
कल्पना करें कि आपके पास एक टेस्ट सूट है। इनिशियलाइज़ेशन के हिस्से के रूप में, आपको नकली Person रिकॉर्ड बनाने की आवश्यकता है। यह सरल है। आप बस एक नया FakePerson रिकॉर्ड बनाते हैं और एक पहला नाम और अंतिम नाम पास करते हैं।
लेकिन क्या होगा यदि आप हर बार टेस्ट चलाने पर अलग-अलग पहला और अंतिम नाम का उपयोग करके सिस्टम को "फज़ टेस्ट" करना चाहते हैं?
इसे करने का एक तरीका **हैश के बजाय एक लैम्ब्डा फ़ंक्शन पास करना** हो सकता है। इस उदाहरण में, मैं उत्कृष्ट Faker जेम के माध्यम से नकली नाम उत्पन्न करने के लिए एक लैम्ब्डा फ़ंक्शन का उपयोग करता हूँ।
यहाँ, लैम्ब्डा एक होने का दिखावा करता है।
लैम्ब्डा में बिल्ट-इन करीइंग है
करीइंग फंक्शनल प्रोग्रामिंग में बहुत उपयोग की जाने वाली एक कूल तकनीक है। यह मौजूदा फ़ंक्शन से नए फ़ंक्शन बनाने का एक तरीका है। जब आप इसे अभ्यास में देखते हैं तो यह समझना आसान होता है।
नीचे दिए गए कोड में मेरे पास एक लैम्ब्डा फ़ंक्शन है जो दो संख्याओं को जोड़ता है। सुविधाजनक रूप से, इसे add कहा जाता है। फिर मैं एक अधिक विशिष्ट फ़ंक्शन increment बनाने के लिए करीइंग का उपयोग करता हूँ। यह केवल किसी भी दी गई संख्या में एक जोड़ता है।
आप Ruby में किसी भी Proc को करी कर सकते हैं
लैम्ब्डा Proc का एक विशेष प्रकार हैं
आपने देखा होगा कि सभी कोड सैंपल में, जब भी मैंने एक लैम्ब्डा फ़ंक्शन परिभाषित किया है, मुझे बदले में एक Proc मिलता है। ऐसा इसलिए है क्योंकि Ruby लैम्ब्डा को Proc के एक प्रकार के रूप में लागू करता है। इसलिए इस आर्टिकल में मैंने आपको जो बहुत सी चीजें दिखाई हैं, उन्हें Procs के साथ-साथ लैम्ब्डा के साथ भी किया जा सकता है।
स्टैबी लैम्ब्डा
इस आर्टिकल में मैंने स्पष्टता के लिए लैम्ब्डा कीवर्ड का उपयोग किया है। लेकिन Ruby 1.9 में पेश किए गए लैम्ब्डा को परिभाषित करने के लिए एक अधिक संक्षिप्त सिंटैक्स है जिसे "स्टैबी लैम्ब्डा" के रूप में जाना जाता है। यहाँ बताया गया है कि यह कैसे काम करता है:
Ruby का स्टैबी लैम्ब्डा सिंटैक्स संस्करण 1.9 में पेश किया गया था