शून्य…
यह वास्तव में क्या है?
खैर, nil एक विशेष रूबी वस्तु है जिसका उपयोग "खाली" या "डिफ़ॉल्ट" मान का प्रतिनिधित्व करने के लिए किया जाता है। यह एक "गलत" मान भी है, जिसका अर्थ है कि यह false . जैसा व्यवहार करता है जब एक सशर्त बयान में प्रयोग किया जाता है।
अब :
केवल एक nil है ऑब्जेक्ट, object_id . के साथ का 4 (या 8 64-बिट रूबी में), यही कारण है कि 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 है value इससे पहले कि आप उस पर कोई विधि कॉल करें।
रूबी में शून्य के लिए परीक्षण
यदि आप "शून्य के लिए अपरिभाषित विधि:NilClass" त्रुटि प्राप्त नहीं करना चाहते हैं, तो इसे आज़माएं...
केवल कॉल विधि यदि शून्य नहीं है :
if array[5] && array[5].size # do something... end
यही कारण है कि रूबी 2.3 ने "सुरक्षित नेविगेटर" ऑपरेटर पेश किया (&. )।
उदाहरण :
if arr[5]&.size # do something... 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 विधियों का एक सेट है।
रुबिनियस से वर्ग परिभाषा यहां दी गई है:
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 . के बारे में कोई चर्चा नहीं शून्य ऑब्जेक्ट पैटर्न का उल्लेख किए बिना पूरा हो गया है।
सैंडी मेट्ज़ ने अपने उत्कृष्ट भाषण "नथिंग इज समथिंग" में यह बात कही है कि nil इसका अर्थ है "कुछ नहीं" इसका अधिक विशिष्ट अर्थ हो सकता है।
उदाहरण के लिए, यदि हम एक ऐसा तरीका लिखते हैं जो उत्पादों को ढूंढता है और हम एक डिफ़ॉल्ट उत्पाद वापस करना चाहते हैं…
हम इस तरह एक अशक्त उत्पाद वापस कर सकते हैं :
class MissingProduct
def name
"Product not found"
end
end
अब अगर हमारे पास वास्तविक उत्पाद वस्तुओं और अशक्त उत्पादों के मिश्रण के साथ एक सरणी है तो इन सभी उत्पादों में name होगा तरीका। इसका मतलब है कि आपको NoMethodError नहीं मिलेगा अपवाद।
युक्ति :यदि आप ऑब्जेक्ट प्रकार की जांच किए बिना अपनी सभी वस्तुओं को उसी तरह से व्यवहार कर सकते हैं तो आप बहुरूपता का लाभ उठा रहे हैं।
इस तरह के ऑब्जेक्ट आपकी प्रस्तुति परत के लिए बहुत अच्छे हैं, लेकिन आपके नियंत्रकों के लिए इतना अधिक नहीं है, जहां आप कुछ अलग करना चाहते हैं यदि आप जो खोज रहे हैं वह उपलब्ध नहीं है, जैसे अलर्ट संदेश दिखाना, रीडायरेक्ट करना, आदि।
सच्चाई
nil के बारे में एक और बात जो आपको जाननी चाहिए क्या यह false . के अलावा एकमात्र मान है (जो एक वस्तु भी है), जिसे "झूठा" माना जाता है।
रूबी में बाकी सब कुछ true माना जाता है एक बूलियन संदर्भ में।
कुछ भाषाएं संख्या 0 . पर विचार करती हैं false . के रूप में मूल्य, लेकिन रूबी में ऐसा नहीं है:
if 0 puts 123 end # 123
यह कह रहा है:"अगर 0 क्या true है फिर प्रिंट करें 123 ".
वीडियो
सारांश
आपने सीखा कि nil सिर्फ एक रूबी वस्तु है जो "कुछ नहीं" का प्रतिनिधित्व करती है।
आपने यह भी सीखा कि nil &false रूबी में केवल दो चीजें हैं जो "झूठी" हैं। बाकी सब कुछ "सत्य" है।
अगर आपको यह पोस्ट अच्छी लगी हो तो शेयर करना न भूलें इसे अपने पसंदीदा सामाजिक नेटवर्क पर!