केस स्टेटमेंट से सरल और अधिक उबाऊ कुछ नहीं हो सकता। यह C से एक होल्डओवर है। आप इसका उपयोग गुच्छा भर ifs को बदलने के लिए करते हैं। केस बंद। या नहीं?
वास्तव में, रूबी में केस स्टेटमेंट आपकी कल्पना से कहीं अधिक समृद्ध और जटिल हैं। आइए सिर्फ एक उदाहरण देखें:
case "Hi there" when String puts "case statements match class" end # outputs: "case statements match class"
यह उदाहरण दिखाता है कि केस स्टेटमेंट न केवल किसी आइटम के मान से बल्कि उसकी क्लास से भी मेल खाते हैं। यह संभव है क्योंकि हुड के तहत, रूबी === ऑपरेटर का उपयोग करता है, जिसे तीन बराबर ऑपरेटर के नाम से भी जाना जाता है।
=== ऑपरेटर का त्वरित भ्रमण
जब आप रूबी में x === y लिखते हैं, तो आप पूछ रहे होते हैं "क्या y, x द्वारा दर्शाए गए समूह से संबंधित है?" यह एक बहुत ही सामान्य कथन है। विशिष्टताएं इस बात पर निर्भर करती हैं कि आप किस प्रकार के समूह के साथ काम कर रहे हैं।
# Here, the Class.===(item) method is called, which returns true if item is an instance of the class String === "hello" # true String === 1 # false
स्ट्रिंग्स, रेगुलर एक्सप्रेशन और रेंज सभी अपने स्वयं के ===(item) मेथड को परिभाषित करते हैं, जो कमोबेश वैसा ही व्यवहार करते हैं जैसा आप उम्मीद करेंगे। आप अपनी खुद की क्लास में ट्रिपल इक्वल्स मेथड भी जोड़ सकते हैं।
अब जब हम यह जानते हैं, तो हम केस के साथ सभी प्रकार की तरकीबें कर सकते हैं।
केस स्टेटमेंट में रेंज मिलान
आप केस स्टेटमेंट में रेंज का उपयोग इस तथ्य के कारण कर सकते हैं कि range === n केवल range.include?(n) का मान लौटाता है। मुझे कैसे पता? यह डॉक्स में है।
case 5 when (1..10) puts "case statements match inclusion in a range" end # outputs "case statements match inclusion in a range"
केस स्टेटमेंट के साथ रेगुलर एक्सप्रेशन मिलान
केस स्टेटमेंट में रेगेक्स का उपयोग करना भी संभव है, क्योंकि /regexp/ === "string" केवल तभी सही लौटाता है जब स्ट्रिंग रेगुलर एक्सप्रेशन से मेल खाती है। Regexp के डॉक्स इसकी व्याख्या करते हैं।
case "FOOBAR" when /BAR$/ puts "they can match regular expressions!" end # outputs "they can match regular expressions!"
प्रॉक्स और लैम्ब्डा मिलान
यह थोड़ा अजीब है। जब आप Proc#===(item) का उपयोग करते हैं, तो यह Proc#call(item) करने के समान है। इसके लिए डॉक्स यहां हैं। इसका मतलब है कि आप अपने केस स्टेटमेंट में लैम्ब्डा और प्रॉक्स को डायनामिक मैचर्स के रूप में उपयोग कर सकते हैं।
case 40 when -> (n) { n.to_s == "40" } puts "lambdas!" end # outputs "lambdas"
अपने खुद के मैचर क्लास लिखना
जैसा कि मैंने ऊपर उल्लेख किया है, अपनी क्लास में कस्टम केस व्यवहार जोड़ना उतना ही सरल है जितना अपना === मेथड परिभाषित करना। इसका एक उपयोग जटिल सशर्त तर्क को कई छोटी क्लास में निकालना हो सकता है। मैंने नीचे स्केच किया है कि यह कैसे काम कर सकता है:
class Success def self.===(item) item.status >= 200 && item.status < 300 end end class Empty def self.===(item) item.response_size == 0 end end case http_response when Empty puts "response was empty" when Success puts "response was a success" end