रूबी में "उपज" शब्द का क्या अर्थ है? और यह वास्तव में क्या करता है?
खैर…
यील्ड एक कीवर्ड है (जिसका अर्थ है कि यह भाषा का एक मुख्य हिस्सा है) और इसका उपयोग किसी ब्लॉक को कॉल करने के तरीकों के अंदर किया जाता है।
यहां बताया गया है कि आपको क्या जानना चाहिए :
- किसी ब्लॉक को कॉल करने से उस ब्लॉक के अंदर कोड चलता है (जैसे किसी विधि को कॉल करना)
- यील्ड किसी भी संख्या में तर्कों को ब्लॉक में पारित कर सकता है
- ब्लॉक का रिटर्न वैल्यू
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 कहते हैं बिना किसी अवरोध के, तो आपको एक त्रुटि मिलती है।
उदाहरण :
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 का उपयोग करना ब्लॉक सक्षम करता है।
हम विधि कॉल के हिस्से के रूप में कोड के बिट्स में पास करने के लिए ब्लॉक का उपयोग करते हैं।
यह तब मददगार होता है जब :
- आप एक सामान्य लॉगिंग फ़ंक्शन लिखना चाहते हैं, जो लॉग करता है कि थोड़ा सा कोड चलने में कितना समय लगता है
- विधि पूरी होने पर आप कुछ कोड चलाना चाहते हैं (जैसे जावास्क्रिप्ट में "कॉलबैक")
- आप "आलसी कोड" चाहते हैं, कोड जो केवल जरूरत पड़ने पर चलता है और जिसे उपयोगकर्ता द्वारा अनुकूलित किया जा सकता है (इसके उदाहरण के लिए,
Hash#fetchके बारे में पढ़ें विधि)
बढ़िया!
यील्ड_सेल्फ - क्या अंतर है?
आपको यह नया yield_self मिल सकता है विधि और सोचें कि यह yield से संबंधित है ।
ठीक है, ऐसा नहीं है।
यहां तक कि yield(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 खाली लेआउट के बराबर!
इस तरह से लेआउट और आपके विचार एक साथ जुड़ जाते हैं।
सारांश
आपने रूबी में उपज कीवर्ड के बारे में सीखा है! वास्तव में यह क्या है, यह कैसे काम करता है और यह क्यों मायने रखता है।
अब इसे अपने रूबी कोड में आज़माएं।
पढ़ने के लिए धन्यवाद!