case (अन्य भाषाओं में इसे अक्सर switch कहा जाता है) if-else जैसे कंट्रोल एक्सप्रेशन का ही एक रूप है।
case की मदद से कई if-else-if स्टेटमेंट एक साथ जोड़े जा सकते हैं, यह पढ़ने में ज़्यादा आसान हो सकता है, और इससे शक्तिशाली संरचनाएँ बनाई जा सकती हैं।
एक case को case कीवर्ड से परिभाषित किया जाता है, जिसके बाद एक वैकल्पिक एक्सप्रेशन आता है।
फिर हर केस के लिए when कीवर्ड का उपयोग किया जाता है, जिसके बाद एक एक्सप्रेशन आता है जिसकी तुलना केस एक्सप्रेशन से की जाती है।
when कीवर्ड को case कीवर्ड से इंडेंट नहीं करना चाहिए।
when कीवर्ड के बाद वह कोड आता है जो तब चलाया जाना चाहिए जब केस एक्सप्रेशन when एक्सप्रेशन से मेल खाता हो।
केस में एक वैकल्पिक else स्टेटमेंट भी हो सकता है, जो तब चलाया जाता है जब कोई और केस मेल न खाए।
केस एक्सप्रेशन का मूल्यांकन किया जाता है और फिर उसकी तुलना हर when एक्सप्रेशन से की जाती है।
तुलना केस सबसम्प्शन ऑपरेटर (===) की मदद से की जाती है।
case 1
when 1
puts "One"
when 2
puts "Two"
else
puts "Other"
end
# => One
# This is the same as:
tmp = 1
if 1 === tmp
puts "One"
elsif 2 === tmp
puts "Two"
else
puts "Other"
end
===)केस सबसम्प्शन ऑपरेटर (===) समानता ऑपरेटर (==) से थोड़ा अलग है।
यह ऑपरेटर जाँचता है कि दाईं ओर की वैल्यू बाईं ओर से बताए गए सेट की सदस्य है या नहीं।
इसका मतलब है कि हर ऑपरेंड कहाँ रखा गया है, यह मायने रखता है।
यह कैसे काम करता है, यह बाईं ओर के टाइप पर निर्भर करता है। उदाहरण के लिए, एक Range जाँचेगा कि दाईं ओर की वैल्यू उस रेंज में है या नहीं, और एक Object जाँचेगा कि दाईं ओर की वैल्यू Object का इंस्टेंस है या नहीं।
(1..3) == 1 # => false
(1..3) === 1 # => true
String == "foo" # => false
String === "foo" # => true
केस में एक ही केस के अंदर कई एक्सप्रेशन मैच किए जा सकते हैं, जिसमें हर संभावित वैल्यू को कॉमा से अलग किया जाता है। अगर इनमें से कोई भी एक्सप्रेशन मेल खाता है, तो यह कोड चलाता है। यह तब काम आता है जब एक ही केस के लिए कई संभावित वैल्यू हों।
case 1
when 1, 2
puts "One or two"
else
puts "Other"
end
केस यह भी जाँच सकते हैं कि कोई वैल्यू किसी रेंज में है या नहीं। इसके लिए when एक्सप्रेशन के रूप में एक रेंज दी जाती है।
case var
when 1..3
puts "One to three"
else
puts "Other"
end
जब केस एक्सप्रेशन की ज़रूरत न हो, तो उसे छोड़ा जा सकता है। ऐसा करने पर हर when एक्सप्रेशन को सत्यता के आधार पर जाँचा जाता है। और इससे ये if-else-if स्टेटमेंट की तरह व्यवहार करते हैं।
case
when 1 == 1
puts "One is equal to one"
when 1 > 2
puts "One is greater than two"
else
puts "Other"
end
Crystal एक लाइन वाले केस स्टेटमेंट की सुविधा देता है।
इसका उपयोग तब किया जा सकता है जब आपके पास एक साधारण, एक लाइन का स्टेटमेंट हो।
एक लाइन वाले when स्टेटमेंट को when <expression> then <statement>. के रूप में लिखा जाता है।
और जब इसे else स्टेटमेंट में इस्तेमाल किया जाता है, तो इसे else <statement> के रूप में लिखा जाता है।
case var
when 1 then puts "One"
when 2 then puts "Two"
else puts "Other"
end
केस में टाइप के साथ मैचिंग की सुविधा है।
तुलना में वेरिएबल का टाइप जाँचने के लिए is_a? ऑपरेटर का उपयोग किया जाता है।
उदाहरण के लिए, इससे यूनियन टाइप के हर टाइप के लिए एक ब्रांच बनाई जा सकती है।
case var
when Int32
puts "Int32"
when String
puts "String"
else
puts "Other"
end
केस में इम्प्लिसिट ऑब्जेक्ट के इस्तेमाल की सुविधा है। इससे, उदाहरण के लिए, एक when एक्सप्रेशन केस एक्सप्रेशन पर एक मेथड कॉल बन सकता है। मेथड सत्य या असत्य वैल्यू लौटाता है या नहीं, इसके आधार पर तय होता है कि केस मैच करेगा या नहीं।
case 1
when .odd?
puts "Odd"
when .even?
puts "Even"
end
केस में एक्सहॉस्टिव केस की सुविधा है, यानी यह सुनिश्चित किया जा सकता है कि सभी संभावित वैल्यू संभाली गई हैं।
यह when स्टेटमेंट जैसा ही है, बस इसमें when की जगह in कीवर्ड का उपयोग होता है।
जब कोई केस एक्सहॉस्टिव होता है, तो वह किसी भी when या else स्टेटमेंट का समर्थन नहीं करता।
एक्सहॉस्टिव केस Bools, Union टाइप, Enum और Tuples पर इस्तेमाल किए जा सकते हैं।
अंतिम दो को आगे के कॉन्सेप्ट में समझाया जाएगा।
एक्सहॉस्टिव केस का मतलब है कि सभी संभावनाओं को संभालना ज़रूरी है, वरना कंपाइल एरर आ जाती है।
Union टाइप को एक्सहॉस्टिव केस की तरह संभालना, नॉन-एक्सहॉस्टिव केस जैसा ही है।
var : (Int32 | String | Bool)
case var
in Int32
puts "Int32"
in String
puts "String"
in Bool
puts "Bool"
end
Bools को true और false कीवर्ड का उपयोग करके एक्सहॉस्टिव केस की तरह संभाला जा सकता है।
var : Bool
case var
in true
puts "True"
in false
puts "False"
end