मैं रूबी कोड के एक टुकड़े के बारे में एक दोस्त के साथ बातचीत कर रहा था और वापसी मूल्यों का विषय सामने आया…
...और निश्चित रूप से, 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
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?
/ ===
) आज आपने जो सीखा है उसका उपयोग करके आप उस कोड को कैसे सुधार सकते हैं?