निल…
यह वास्तव में क्या है?
खैर, nil एक विशेष रूबी ऑब्जेक्ट है जिसका उपयोग "खाली" या "डिफ़ॉल्ट" मान को दर्शाने के लिए किया जाता है। यह एक "फाल्सी" मान भी है, जिसका अर्थ है कि कंडीशनल स्टेटमेंट में उपयोग किए जाने पर यह false की तरह व्यवहार करता है।
अब:
केवल एक nil ऑब्जेक्ट होता है, जिसका object_id 4 होता है (या 64-बिट रूबी में 8), यही कारण है कि nil विशेष है।
nil.object_id # 4
आइए गहराई से देखें!
निल मान कहाँ से आते हैं?
कई मेथड्स परिणाम के रूप में nil लौटा सकते हैं।
यह तब होता है जब आप किसी मान के लिए पूछते हैं लेकिन वह मान उपलब्ध नहीं होता।
उदाहरण:
- उत्पाद नहीं मिला
- सरणी इंडेक्स आउट ऑफ बाउंड्स
- हैश कुंजी मौजूद नहीं है
इसे प्रदर्शित करने के लिए कुछ कोड:
arr = [1,2,3] arr[5] # nil
यह अक्सर सभी प्रकार की समस्याओं का कारण बनेगा क्योंकि हम उम्मीद करते हैं कि हमारे द्वारा कॉल किया गया मेथड nil के बजाय एक वैध मान लौटाएगा।
जैसे यह NoMethodError अपवाद:
arr[5].size # NoMethodError: undefined method 'size' for nil:NilClass
इस त्रुटि से बचने के लिए, आपको इस पर मेथड कॉल करने से पहले जांचना होगा कि आपके पास nil मान है या नहीं।
रूबी में निल के लिए परीक्षण
यदि आप "undefined method for nil:NilClass" त्रुटि नहीं चाहते हैं तो इसे आज़माएं…
केवल मेथड कॉल करें यदि निल नहीं है:
if array[5] && array[5].size # कुछ करें... end
यही कारण है कि रूबी 2.3 ने "सेफ नेविगेटर" ऑपरेटर (&.) पेश किया।
उदाहरण:
if arr[5]&.size # कुछ करें... end
निल के लिए परीक्षण करने का एक और तरीका nil? मेथड का उपयोग करना है:
if @bacon.nil? # ... end
एक अन्य विकल्प blank? मेथड का उपयोग करना है (केवल रेल्स)।
आप जिस ऑब्जेक्ट के साथ काम कर रहे हैं, उसके आधार पर nil मानों की जांच से पूरी तरह बचने के लिए आप कुछ तकनीकों का उपयोग कर सकते हैं।
उदाहरण के लिए, आप हैश और सरणी ऑब्जेक्ट्स पर fetch मेथड का उपयोग कर सकते हैं।
या आप अपने स्वयं के वर्गों में "नल ऑब्जेक्ट पैटर्न" का उपयोग कर सकते हैं यदि आप nil के बजाय डिफ़ॉल्ट मान लौटाना चाहते हैं।
अन्य स्थान जहां निल छिपा होता है
आपको पता होना चाहिए कि अपरिभाषित इंस्टेंस वेरिएबल्स nil लौटाएंगे।
@foo # nil
इसलिए इसके लिए सावधान रहें, हो सकता है कि आपने अपने इंस्टेंस वेरिएबल का नाम गलत लिखा हो या आप इसे इनिशियलाइज़ करना भूल गए हों!
nil पाए जाने का एक और स्थान puts और print मेथड्स के साथ है।
ये दो मेथड्स हमेशा nil लौटाते हैं।
मैं इसका उल्लेख करता हूं क्योंकि मैंने अपने कुछ छात्रों को ऐसा कुछ करने की कोशिश करते देखा है:
numbers = [1,2,3].map { |n| puts n * 2 } जिसके परिणामस्वरूप numbers [nil, nil, nil] हो जाता है। इस मामले में समाधान ब्लॉक के अंदर से puts को बस हटाना है।
NilClass को समझना
किसी भी अन्य रूबी ऑब्जेक्ट की तरह nil के पास मेथड्स का एक सेट होता है।
यहाँ Rubinius से क्लास परिभाषा है:
class NilClass def to_s "" end def inspect "nil" end def nil? true end def to_a [] end def to_f 0.0 end def to_i 0 end def to_c Complex(0) end def to_h {} end end ध्यान दें कि कैसे ये सभी to_something मेथड्स एक खाली मान लौटाते हैं (संख्याओं के लिए 0)।
खाली हैश, खाली स्ट्रिंग, खाली सरणी…
इसका कारण यह है कि nil "कुछ नहीं" को दर्शाने के लिए उपयोग किया जाता है।
नल ऑब्जेक्ट पैटर्न
nil के बारे में कोई भी चर्चा नल ऑब्जेक्ट पैटर्न का उल्लेख किए बिना पूरी नहीं होती।
अपनी उत्कृष्ट वार्ता, "Nothing is Something" में, संडी मेट्ज़ यह बात रखती हैं कि जबकि nil का अर्थ "कुछ नहीं" है, इसका अधिक विशिष्ट अर्थ हो सकता है।
उदाहरण के लिए, यदि हम एक मेथड लिखते हैं जो उत्पाद ढूंढता है और हम एक डिफ़ॉल्ट उत्पाद लौटाना चाहते हैं…
हम इस तरह एक नल उत्पाद लौटा सकते हैं:
class MissingProduct def name "Product not found" end end
अब यदि हमारे पास वास्तविक उत्पाद ऑब्जेक्ट्स और नल उत्पादों का मिश्रण है तो इन सभी उत्पादों में name मेथड होगा। इसका मतलब है कि आपको NoMethodError अपवाद नहीं मिलेगा।
टिप: यदि आप अपने सभी ऑब्जेक्ट्स को उसी तरह से व्यवहार कर सकते हैं, बिना ऑब्जेक्ट प्रकार की जांच किए तो आप पॉलीमॉर्फिज्म का लाभ उठा रहे हैं।
इस तरह के ऑब्जेक्ट्स आपके प्रेजेंटेशन लेयर के लिए बहुत अच्छे हैं, लेकिन आपके कंट्रोलर्स के लिए इतना नहीं जहां आप कुछ अलग करना चाहते हैं यदि आप जो ढूंढ रहे हैं वह उपलब्ध नहीं है, जैसे अलर्ट संदेश दिखाना, रीडायरेक्ट, आदि।
सत्यता (Truthiness)
nil के बारे में आपको एक और बात जानने की जरूरत है कि false के अलावा (जो एक ऑब्जेक्ट भी है), यह एकमात्र मान है जिसे "फाल्सी" माना जाता है।
रूबी में बाकी सब कुछ बूलियन संदर्भ में true माना जाता है।
कुछ भाषाएं संख्या 0 को false मान मानती हैं, लेकिन रूबी में ऐसा नहीं है:
if 0 puts 123 end # 123
यह कह रहा है: "यदि 0 true है तो 123 प्रिंट करें"।
वीडियो
सारांश
आपने सीखा कि nil सिर्फ एक रूबी ऑब्जेक्ट है जो "कुछ नहीं" को दर्शाता है।
आपने यह भी सीखा कि nil और false रूबी में केवल दो चीजें हैं जो "फाल्सी" हैं। बाकी सब "ट्रूथी" है।
यदि आपको यह पोस्ट पसंद आया तो इसे अपने पसंदीदा सोशल नेटवर्क पर शेयर करना न भूलें!