केस (अक्सर दूसरी भाषाओं में इसे switch कहा जाता है), if-else की तरह कंट्रोल एक्सप्रेशन का ही एक रूप है। केस की मदद से कई if-else-if स्टेटमेंट एक साथ जोड़े जा सकते हैं। ऐसा कोड पढ़ने में ज़्यादा साफ़ लगता है, और फ्लो कंट्रोल भी बना रहता है।
केस case कीवर्ड से बनता है, जिसके बाद एक वैकल्पिक एक्सप्रेशन लिखा जाता है।
फिर हर केस के लिए when कीवर्ड लिखा जाता है, और उसके बाद वह एक्सप्रेशन आता है जिसकी तुलना केस एक्सप्रेशन से की जाती है।
when कीवर्ड को case कीवर्ड से अधिक इंडेंट नहीं करना चाहिए।
when कीवर्ड के बाद वह कोड लिखा जाता है जो तब चलाया जाता है जब केस एक्सप्रेशन और when एक्सप्रेशन मेल खाते हैं।
केस में एक वैकल्पिक else स्टेटमेंट भी लिखा जा सकता है, जो तब चलता है जब कोई और केस मेल नहीं खाता।
केस एक्सप्रेशन का मूल्यांकन किया जाता है, और फिर उसकी तुलना हर when एक्सप्रेशन से की जाती है।
तुलना के लिए केस समानता ऑपरेटर (===) का उपयोग किया जाता है।
value = 1
case value
when 1
"One"
when 2
"Two"
else
"Other"
end
# This is the same as:
value = 1
if 1 === value
"One"
elsif 2 === value
"Two"
else
"Other"
end
===)केस समानता ऑपरेटर (===) समानता ऑपरेटर (==) से थोड़ा अलग है।
यह ऑपरेटर जाँचता है कि दाईं ओर की वैल्यू, बाईं ओर बताए गए समूह का सदस्य है या नहीं।
इसका मतलब है कि यह मायने रखता है कि हर ऑपरेंड किस तरफ़ रखा गया है।
यह कैसे काम करता है, यह बाईं ओर के टाइप पर निर्भर करता है। जैसे Range यह जाँचता है कि दाईं ओर की वैल्यू रेंज के अंदर है या नहीं, और Object यह जाँचता है कि दाईं ओर की वैल्यू Object का इंस्टेंस है या नहीं।
(1..3) == 1 # => false
(1..3) === 1 # => true
String == "foo" # => false
String === "foo" # => true
केस में एक ही जगह कई एक्सप्रेशन मैच किए जा सकते हैं, जहाँ हर संभव वैल्यू को कॉमा से अलग किया जाता है। अगर इनमें से कोई भी एक्सप्रेशन मैच हो जाए, तो कोड चल जाता है। यह तब काम आता है जब आप चाहते हैं कि एक ही केस के लिए कई संभव वैल्यू हों।
case var
when 1, 2
"One or two"
else
"Other"
end
केस यह भी जाँच सकता है कि कोई वैल्यू किसी रेंज के अंदर है या नहीं। इसके लिए when एक्सप्रेशन के रूप में एक रेंज का उपयोग किया जाता है।
case var
when 1..3
puts "One to three"
else
puts "Other"
end
जब केस एक्सप्रेशन की ज़रूरत न हो, तो उसे छोड़ा जा सकता है। ऐसा करने पर हर when एक्सप्रेशन की जाँच केवल इस आधार पर की जाती है कि वह सही है या नहीं। इससे ये if-else-if स्टेटमेंट की तरह व्यवहार करते हैं।
case
when 1 == 1
"One is equal to one"
when 1 > 2
"One is greater than two"
else
"Other"
end
Ruby में एक ही लाइन वाले केस स्टेटमेंट लिखे जा सकते हैं।
इसका उपयोग तब किया जा सकता है जब आपके पास कोई सरल, एक लाइन वाला स्टेटमेंट हो।
एक लाइन वाला when स्टेटमेंट इस तरह लिखा जाता है: when <expression> then <statement>।
और जब इसे else स्टेटमेंट में इस्तेमाल किया जाता है, तो यह else <statement> लिखा जाता है।
case var
when 1 then "One"
when 2 then "Two"
else "Other"
end
केस की मदद से टाइप के आधार पर भी मैच किया जा सकता है। यह तब काम आता है जब वेरिएबल के टाइप के हिसाब से अलग-अलग व्यवहार चाहिए हो।
case var
when Integer
"Integer"
when String
"String"
else
"Other"
end
इस अभ्यास में हम Blackjack खेल की पहली बारी का अनुकरण करेंगे।
आपको दो कार्ड मिलेंगे और आप डीलर का खुला हुआ कार्ड देख पाएँगे। सभी कार्ड एक स्ट्रिंग से दर्शाए जाते हैं, जैसे "ace", "king", "three", "two" इत्यादि। हर कार्ड की वैल्यू यह है:
| card | value | card | value |
|---|---|---|---|
| ace | 11 | eight | 8 |
| two | 2 | nine | 9 |
| three | 3 | ten | 10 |
| four | 4 | jack | 10 |
| five | 5 | queen | 10 |
| six | 6 | king | 10 |
| seven | 7 | other | 0 |
आम तौर पर ace की वैल्यू 1 या 11 हो सकती है, लेकिन सरलता के लिए हम मान लेंगे कि ये केवल 11 की वैल्यू ले सकते हैं।
Blackjack.parse_card मेथड बनाइए, जो आर्गुमेंट के रूप में एक कार्ड को स्ट्रिंग के रूप में लेता है।
मेथड को कार्ड की वैल्यू पूर्णांक के रूप में लौटाना चाहिए।
Blackjack.parse_card("ace")
# => 11
खिलाड़ी के स्कोर को वैल्यू के रेंज में बाँटा जाता है। खिलाड़ी का स्कोर उसके दोनों कार्ड की वैल्यू जोड़कर निकाला जाता है। जिन रेंजों का इस्तेमाल किया जाता है, वे ये हैं:
| range | value |
|---|---|
| low | [4, 11] |
| mid | [12, 16] |
| high | [17, 20] |
| blackjack | [21] |
Blackjack.card_range मेथड बनाइए, जो आर्गुमेंट के रूप में दो कार्ड को स्ट्रिंग के रूप में लेता है।
मेथड को उस रेंज का नाम लौटाना चाहिए जिसमें ये दोनों कार्ड आते हैं।
Blackjack.card_range("ten", "king")
# => "high"
आपके दो कार्ड और डीलर के कार्ड के आधार पर खेल की पहली बारी के लिए एक रणनीति होती है, जिसमें आपके पास ये विकल्प होते हैं:
हालाँकि यह अभी सबसे अच्छी नहीं है, फिर भी आप उस रणनीति का पालन करेंगे जिसे आपका दोस्त Alex तैयार कर रहा है। वह इस प्रकार है:
Blackjack.first_turn मेथड बनाइए, जो आर्गुमेंट के रूप में तीन कार्ड को स्ट्रिंग के रूप में लेता है।
मेथड को वह फैसला स्ट्रिंग के रूप में लौटाना चाहिए जो आपको लेना चाहिए।
Blackjack.first_turn("ace", "ace", "two")
# => "P"
Exercism पर साइन अप कीजिए और Ruby को 21 कॉन्सेप्ट121 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।