रूबी में "yield" शब्द का क्या अर्थ है? और यह वास्तव में क्या करता है?
खैर...
Yield एक कीवर्ड है (मतलब यह भाषा का एक मुख्य हिस्सा है) और इसका उपयोग मेथड्स के अंदर ब्लॉक को कॉल करने के लिए किया जाता है।
यहां आपको क्या जानने की आवश्यकता है:
- ब्लॉक को कॉल करने से उस ब्लॉक के अंदर का कोड चलता है (मेथड को कॉल करने की तरह)
- Yield ब्लॉक को किसी भी संख्या में आर्ग्युमेंट्स पास कर सकता है
- ब्लॉक का रिटर्न मान
yieldके लिए रिटर्न मान बन जाता है
आपको इसके लिए ब्लॉक्स को समझना होगा।
आप ब्लॉक्स को बिना नाम के मेथड्स के रूप में सोच सकते हैं जिन्हें अन्य मेथड्स के लिए अतिरिक्त आर्ग्युमेंट्स के रूप में पास किया जा सकता है।
यहां एक उदाहरण है:
def make_salad yield "lettuce" yield "carrots" yield "olive oil" end make_salad { |ingredient| puts "Adding #{ingredient} to salad!" } यह ब्लॉक को 3 बार कॉल करता है, यह आउटपुट उत्पन्न करता है:
Adding lettuce to salad! Adding carrots to salad! Adding olive oil to salad!
यही सार है yield का, यह मेथड कॉल करने जैसा है, लेकिन इसके बजाय आप ब्लॉक को कॉल कर रहे हैं।
ब्लॉक के लिए हमारे पास नाम नहीं है, इसलिए यह कीवर्ड इसका ख्याल रखता है।
अब:
आइए देखें कि क्या होता है यदि आपके पास कॉल करने के लिए ब्लॉक नहीं है।
ब्लॉक के बिना Yield == त्रुटि संदेश
यदि आप ब्लॉक के बिना yield कॉल करते हैं, तो आपको त्रुटि मिलती है।
उदाहरण:
def write_code yield end write_code # LocalJumpError: no block given (yield)
यह त्रुटि क्रिस्टल-क्लियर है, "कोई ब्लॉक नहीं दिया गया" का मतलब है कि मेथड कॉल write_code ब्लॉक प्रदान नहीं कर रहा है।
आप इस त्रुटि को कैसे रोक सकते हैं?
इस तरह:
def write_code yield if block_given? end
block_given? मेथड जांचता है कि क्या ब्लॉक उपलब्ध है और यह आपको केवल तभी yield करने की अनुमति देता है जब यह सच हो।
Yield का उपयोग क्यों करें?
yield का उपयोग ब्लॉक्स को सक्षम करता है।
हम ब्लॉक्स का उपयोग मेथड कॉल के हिस्से के रूप में कोड के टुकड़ों को पास करने के लिए करते हैं।
यह तब उपयोगी होता है जब:
- आप एक जेनेरिक लॉगिंग फंक्शन लिखना चाहते हैं, जो लॉग करता है कि कोड का एक टुकड़ा चलने में कितना समय लेता है
- आप चाहते हैं कि मेथड समाप्त होने पर कुछ कोड चले (जावास्क्रिप्ट में "कॉलबैक्स" की तरह)
- आप "आलसी कोड" चाहते हैं, कोड जो केवल तभी चलता है जब आवश्यक हो और जिसे उपयोगकर्ता द्वारा अनुकूलित किया जा सके (इसका उदाहरण
Hash#fetchमेथड के बारे में पढ़ें)
अच्छा!
Yield_Self - अंतर क्या है?
आपको यह नया yield_self मेथड मिल सकता है और सोच सकते हैं कि यह yield से संबंधित है।
खैर, यह नहीं है।
यहां तक कि yield(self) भी अलग है, क्योंकि self वर्तमान ऑब्जेक्ट को संदर्भित करता है।
जहां yield_self, जिसे रूबी 2.5 में जोड़ा गया था, उस ऑब्जेक्ट को संदर्भित करता है जिस पर हम मेथड कॉल कर रहे हैं।
इस मेथड के लिए एक अच्छा उपयोग?
जब भी आप मेथड्स को चेन करना चाहते हैं और उस ऑब्जेक्ट के साथ कुछ करना चाहते हैं जिस पर आप yield_self कॉल कर रहे हैं, इसका उपयोग करें।
मूल ऑब्जेक्ट के बजाय परिणाम लौटाते हुए।
उदाहरण:
n_squared = ->(n) { n ** 2 } 2 .yield_self(&n_squared) .yield_self(&n_squared) # 16 रूबी 2.6 में, yield_self के लिए एक उपनाम है, then मेथड।
लेकिन इसे अपने नियमित yield से भ्रमित न करें।
ठीक है?
रेल्स में Yield
मुझे रेल्स और टेम्पलेटिंग इंजन में yield के उपयोग का त्वरित उल्लेख भी देना चाहिए।
आप लेआउट्स के अंदर yield पाएंगे।
रेल्स इसे आपके द्वारा रेंडर किए जा रहे व्यू की सामग्री से बदल देता है।
कोई yield नहीं बराबर खाली लेआउट!
यही वह तरीका है जिससे लेआउट और आपके व्यू एक साथ जुड़ते हैं।
सारांश
आपने रूबी में yield कीवर्ड के बारे में सीखा! वास्तव में यह क्या है, यह कैसे काम करता है और यह क्यों मायने रखता है।
अब इसे अपने रूबी कोड में आज़माएं।
पढ़ने के लिए धन्यवाद! 🙂