मैं रूबी कोड के एक टुकड़े के बारे में एक दोस्त के साथ चैट कर रहा था और रिटर्न वैल्यू का विषय आया…
…और निश्चित रूप से, nil हमेशा उस बातचीत का हिस्सा होता है।
उसी दिन बाद में, मैं सोने से पहले बिस्तर पर था, सोच रहा था, हम nil का उपयोग क्यों करते हैं?
मुझे लगा कि अगले दिन इस बारे में लिखना एक अच्छा विचार होगा, और यहां मैं हूं। मुझे आशा है कि आप इसे दिलचस्प पाएंगे और कुछ नया सीखेंगे!
रिटर्न वैल्यू और अपेक्षित व्यवहार पर
जब आप select जैसे मेथड को कॉल करते हैं तो आपको हमेशा एक सरणी मिलने वाली है।
यहां तक कि अगर चुनने के लिए कुछ भी नहीं है।
उदाहरण:
[1,2,3].select {} # [] [1,2,3].select(&:even?) # [2] लेकिन यह महत्वपूर्ण क्यों है?
अच्छा सवाल!
यदि आपको हमेशा एक सरणी मिलती है तो आप सरणी मेथड्स (size, empty?, push…) को बिना जांचे कि आप वास्तव में एक सरणी के साथ काम कर रहे हैं कॉल कर सकते हैं।
यह एक अच्छी बात है क्योंकि क्लास जांच उच्च कपलिंग की ओर ले जाती है।
यदि आप अधिक लचीला कोड लिखना चाहते हैं तो "यह किस क्लास का है" की जांच करने से जितना संभव हो उतना बचें।
एकल मान लौटाना
ठीक है, लेकिन find जैसे मेथड के बारे में क्या, जो केवल एक मान लौटाता है?
यदि तत्व मिल जाता है तो यह बस काम करता है:
[1,2,3].find { |n| n == 2 } # 2 यदि कोई मेल नहीं है, तो find को कुछ न कुछ लौटाना होगा, यह false लौटा सकता है, लेकिन अगर हम इस रिटर्न वैल्यू पर मेथड कॉल करने की उम्मीद कर रहे हैं तो हमें एक अपवाद मिलेगा।
यहीं nil आता है, हम इसका उपयोग करते हैं क्योंकि यह एक सामान्य नल ऑब्जेक्ट के सबसे करीब है जो हमें मिल सकता है।
जैसा कि आप मेरे पिछले लेख में nil पर याद कर सकते हैं, मैंने आपको दिखाया कि कैसे nil to_i, to_s और to_a जैसे मेथड्स के साथ एक क्लास है।
यह आपको Array(), और String() जैसे मेथड्स का उपयोग करके एक वस्तु को इन प्रकारों में बदलने की अनुमति देता है।
उदाहरण:
String(123) # "123" String(nil) # "" Array(nil) # []
यह स्ट्रिंग इंटरपोलेशन में भी आता है:
"abc#{nil}dfg" स्ट्रिंग इंटरपोलेशन इंटरपोलेशन ब्लॉक के अंदर जो कुछ भी है उसका मूल्यांकन करने के परिणाम पर to_s कॉल करता है। तो यदि आपके पास #{1 + 1} है तो यह 2.to_s में परिवर्तित हो जाता है।
अब nil के साथ समस्या तब आती है जब आप इसकी उम्मीद नहीं करते, आपको लगता है कि यह कोई वस्तु है जो foo मेथड का जवाब देती है, लेकिन यह नहीं है, इसलिए आपको डरावना NoMethodError अपवाद मिलता है।
उस स्थिति में, आप नल ऑब्जेक्ट पैटर्न को लागू करना चाहते हैं, जैसा कि मैं इस लेख में वर्णन करता हूं। अन्य समाधानों में डिफ़ॉल्ट मान के साथ fetch मेथड का उपयोग करना और जब डिफ़ॉल्ट मान समझ में न आए तो अपवाद उठाना शामिल है।
सारांश
आपने सीखा कि हम nil का उपयोग क्यों करते हैं, nil मान पर मेथड्स कॉल करने से आने वाले अपवादों से कैसे बचें, और अधिक आत्मविश्वास से कोड कैसे लिखें।
अपने कोड को देखें और देखें कि क्या आप कुछ टाइप-चेकिंग कोड (is_a? / kind_of? / ===) को पहचान सकते हैं। आप आज जो सीखा उसका उपयोग करके उस कोड को कैसे सुधार सकते हैं?