Crystal में Nil नाम का एक टाइप होता है, जिसमें सिर्फ एक ही वैल्यू हो सकती है: nil।
इसका उपयोग किसी वैल्यू के न होने को दर्शाने के लिए किया जाता है, और यह दूसरी भाषाओं के null या None जैसा होता है।
कई मेथड nil लौटा सकते हैं, जैसे String#[]?, जो इंडेक्स के सीमा से बाहर होने पर nil लौटाता है।
"foo"[10]? # => nil
Crystal में NULL REFERENCE CHECKS होते हैं। इसका मतलब है कि डिफ़ॉल्ट रूप से किसी भी टाइप की वैल्यू nil नहीं हो सकती।
यानी आप किसी वेरिएबल को nil असाइन नहीं कर सकते, जब तक कि आप उसे स्पष्ट रूप से Nil टाइप घोषित न करें।
और इसका मतलब है कि कंपाइलर null रेफ़रेंस की जाँच खुद कर लेता है।
nil वैल्यू को संभालने के कुछ तरीके हैं।
nil एक फॉल्सी वैल्यू है, और false भी।
इसका मतलब है कि स्टेटमेंट में और ऐसी हर जगह जहाँ फॉल्सी या ट्रूथी वैल्यू की अपेक्षा होती है, nil के साथ वही व्यवहार होता है जो false के साथ होता है।
if nil
puts "nil is truthy"
else
puts "nil is falsey"
end
# => nil is falsey
इसका मतलब है कि अगर किसी वेरिएबल में nil हो सकता है और उसकी वैल्यू nil है, तो ट्रूथी शाखा नहीं चुनी जाएगी।
foo = "boo"[2]? # It is possible that foo is nil
if foo
p foo.class # => Char
end
Crystal में एक मेथड है जिससे जाँच सकते हैं कि कोई वैल्यू nil है या नहीं।
इसे nil? कहते हैं और यह सभी ऑब्जेक्ट पर उपलब्ध होता है।
foo = "boo"[2]?
if foo.nil?
puts "foo is nil"
else
puts "foo is not nil"
end
यह उस स्थिति से थोड़ा अलग है जब आप वैल्यू को सीधे if स्टेटमेंट में इस्तेमाल करते हैं, क्योंकि पिछले उदाहरणों में false और nil दोनों को ही फॉल्सी माना जाता है।
यहाँ सिर्फ nil को ही फॉल्सी माना जाता है। अगर वैल्यू false होती, तो वह nil न होती, इसलिए वह ट्रूथी होती।
nil वैल्यू से निपटने का सबसे आसान तरीका यह है कि वे शुरू से ही nil न बनें।
ऑर ऑपरेटर (||) का इस्तेमाल अक्सर Bools को संभालते समय किया जाता है, लेकिन अगर इसे ठीक से समझ लिया जाए, तो यह nil वैल्यू को संभालने में भी काम आ सकता है।
ऑर ऑपरेटर जाँचता है कि पहली वैल्यू ट्रूथी है या नहीं। अगर नहीं, तो दूसरी वैल्यू इस्तेमाल की जाती है।
इसका इस्तेमाल इस तरह किया जा सकता है कि अगर वैल्यू nil हो, तो वह फॉल्सी होगी और इस तरह दूसरी वैल्यू इस्तेमाल की जाएगी।
"foo"[10]? || "bar" # => "bar"
महारानी काल्मार संघ की राजधानी कोपेनहेगन में एक रात्रिभोज का आयोजन कर रही हैं। यह साल का सबसे बड़ा आयोजन है और इसमें सभी कुलीनों को बुलाया गया है। लेकिन देश भर में यह अफवाह फैल रही है कि महारानी को ज़हर देने का षड्यंत्र रचा जा रहा है।
महारानी ने आपसे, जो राजकीय ज़हर-खोजी हैं, यह पता लगाने को कहा है कि किसी खाने या पेय में ज़हर तो नहीं है। महारानी खाने में केवल Mushroom pasties परोसने की योजना बना रही हैं, लेकिन पेय कई तरह के हैं।
यदि खाना वह नहीं है जो महारानी ने मंगवाया था, तो उसमें ज़हर होने की बहुत संभावना है। ऐसा खाना फेंक देना चाहिए।
check_food? मेथड लागू कीजिए, जो food आर्गुमेंट लेता है। इस आर्गुमेंट में खाने का नाम एक String के रूप में रखा जाता है। अगर खाना Mushroom pasties है, तो मेथड वही खाना लौटाता है; वरना यह nil लौटाता है।
CastleDinner.check_food?("Mushroom pasties")
# => "Mushroom pasties"
CastleDinner.check_food?("Bread")
# => nil
यह संभव है कि पेय में ज़हर हो, लेकिन यह पता लगाना उससे थोड़ा ज़्यादा मुश्किल है। अगर पेय के नाम में अक्षर i नहीं है, तो वह ज़हर-युक्त है; छोटे या बड़े अक्षर से कोई फर्क नहीं पड़ता। ज़हर-युक्त पेय को फेंक देना चाहिए।
check_drink? मेथड लागू कीजिए, जो drink आर्गुमेंट लेता है। इस आर्गुमेंट में पेय का नाम एक String के रूप में रखा जाता है। अगर पेय में ज़हर नहीं है, तो मेथड वह पेय लौटाता है; वरना यह nil लौटाता है।
CastleDinner.check_drink?("Apple juice")
# => "Apple juice"
CastleDinner.check_drink?("Tea")
# => nil
महारानी नहीं चाहेंगी कि उनके अतिथि खाने में ज़हर की चिंता करें। इसलिए अगर पेय में ज़हर है, तो उसे एक नए पेय से बदल देना चाहिए, यानी Apple juice से।
replace_drink मेथड लागू कीजिए, जो drink आर्गुमेंट लेता है। इस आर्गुमेंट में पेय का नाम एक String के रूप में रखा जाता है। अगर पेय में ज़हर नहीं है, तो मेथड वह पेय लौटाता है; वरना यह "Apple juice" लौटाता है।
CastleDinner.replace_drink("Orange juice")
# => "Orange juice"
CastleDinner.replace_drink("Tea")
# => "Apple juice"
Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।