Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी के निल ऑब्जेक्ट की निश्चित गाइड: यह क्या है, कैसे काम करता है, और यह क्यों मायने रखता है

निल…

यह वास्तव में क्या है?

खैर, 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 रूबी में केवल दो चीजें हैं जो "फाल्सी" हैं। बाकी सब "ट्रूथी" है।

यदि आपको यह पोस्ट पसंद आया तो इसे अपने पसंदीदा सोशल नेटवर्क पर शेयर करना न भूलें!

  1. GDPR के लिए एक व्यापक गाइड: प्रमुख सिद्धांत, अनुपालन और सर्वोत्तम अभ्यास GDPR के लिए एक व्यापक गाइड: प्रमुख सिद्धांत, अनुपालन और सर्वोत्तम अभ्यास

    कैम्ब्रिज एनालिटिका द्वारा फेसबुक उपयोगकर्ताओं के डेटा के दुरुपयोग ने दुनिया भर के लाखों लोगों का ध्यान आकर्षित किया। इसने लोगों को पहले से कहीं अधिक डेटा गोपनीयता और डेटा सुरक्षा के महत्व का एहसास कराया। लोगों में डेटा गोपनीयता और सुरक्षा के बारे में बढ़ती जांच के साथ चिंता बढ़ने के साथ। यूरोपीय सं

  1. ब्लूटूथ 5: सुविधाओं, लाभों और अनुकूलता के लिए एक व्यापक गाइड ब्लूटूथ 5: सुविधाओं, लाभों और अनुकूलता के लिए एक व्यापक गाइड

    वाई-फाई की तरह, ब्लूटूथ किसी भी मोबाइल या अन्य डिवाइस का एक अभिन्न अंग है। न केवल इसका उपयोग फ़ाइलों और डेटा को ट्रांसफर करने के लिए किया जाता है बल्कि यह आपको अपने वायरलेस डिवाइस जैसे स्पीकर, स्पोर्ट्स इयरफोन आदि को कनेक्ट करने की भी अनुमति देता है। ब्लूटूथ ने न केवल संचार के तरीके को बदल दिया बल्

  1. PBM फाइल्स समझें: मुख्य तथ्य और उनका उपयोग कैसे करें PBM फाइल्स समझें: मुख्य तथ्य और उनका उपयोग कैसे करें

    जब से कंप्यूटर सुलभ हुए हैं, आप टेक्नोलॉजी और मनोरंजन के क्षेत्र में उल्लेखनीय वृद्धि देख सकते हैं। मनोरंजन के सबसे आम स्रोतों में से एक है आपकी तस्वीरें और अन्य मीडिया। हालांकि, वर्तमान टेक्नोलॉजी आपको किसी विशिष्ट टूल को चुनने के लिए परेशान नहीं करती जो किसी फाइल को सपोर्ट कर सके। लेकिन यह जानना अ