Gleam में case एक्सप्रेशन की मदद से कोड को शर्त के अनुसार चलाया जा सकता है। case एक्सप्रेशन की सहायता से किसी वैल्यू की जाँच एक या अधिक पैटर्न के सामने की जा सकती है। ऐसे ही एक पैटर्न का उदाहरण लिटरल पैटर्न है, जो किसी वैल्यू की तुलना किसी लिटरल वैल्यू (जैसे 1 या "hello") से करता है।
case एक्सप्रेशन को case कीवर्ड के साथ लिखा जाता है:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
1 -> "One"
}
}
हालाँकि यह दूसरी भाषाओं के switch स्टेटमेंट जैसा दिख सकता है, लेकिन पैटर्न मैचिंग की असली शक्ति तब दिखती है जब आप दूसरे पैटर्न भी इस्तेमाल करते हैं। ऐसा ही एक पैटर्न वेरिएबल पैटर्न है, जिसकी मदद से किसी वेरिएबल में वैल्यू असाइन की जा सकती है। इस उदाहरण में, अगर number की वैल्यू 0 नहीं है, तो वेरिएबल i को वह वैल्यू असाइन कर दी जाएगी:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
कुछ मामलों में आप किसी पैटर्न में एक और शर्त जोड़ना चाह सकते हैं। इसे गार्ड (क्लॉज़) कहते हैं, जिसे if कीवर्ड की मदद से जोड़ा जा सकता है:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
परफॉर्मेंस के कारणों से गार्ड में सिर्फ बुनियादी गणितीय और बूलियन ऑपरेटर ही इस्तेमाल किए जा सकते हैं, गार्ड में दूसरे फंक्शन इस्तेमाल नहीं किए जा सकते।
ऊपर के उदाहरण में, हर संभव इनपुट के लिए कोई मिलता हुआ पैटर्न मौजूद नहीं है। कंपाइलर इसे पकड़ लेगा और एक एरर दिखाएगा। इसे एक्सहॉस्टिव चेकिंग कहते हैं। इस चेतावनी को दूर करने के लिए सभी केसों को संभालना पड़ता है। इसके लिए डिस्कार्ड पैटर्न इस्तेमाल किया जा सकता है, जो किसी भी वैल्यू से मैच कर जाता है:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
एक ही क्लॉज़ में कई पैटर्न मैच किए जा सकते हैं, और हर पैटर्न को अलग करने के लिए | इस्तेमाल किया जाता है। एक क्लॉज़ में सिर्फ एक ही गार्ड जोड़ा जा सकता है:
pub fn describe(number: Int) -> String {
let yell = True
case number {
0 -> "Zero"
3 | 5 -> "One of the first odd prime numbers"
2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
case एक्सप्रेशन किसी वैल्यू को ऊपर से नीचे तक हर पैटर्न के सामने जाँचता है, जब तक कि उसे कोई मिलता हुआ पैटर्न न मिल जाए और वह उस पैटर्न से जुड़ा कोड चला न दे। पैटर्न का क्रम मायने रखता है!
इस अभ्यास में आप एक दोस्त के साथ संख्या अनुमान लगाने का खेल खेल रहे हैं। नियम आसान हैं: आप चुपके से 1 और 100 के बीच कोई संख्या चुनते हैं, और आपका दोस्त अंदाज़ा लगाने की कोशिश करता है कि आपने कौन-सी संख्या चुनी है। दोस्त की मदद के लिए, आपका जवाब इस बात पर निर्भर करता है कि अंदाज़ा आपकी चुनी हुई संख्या (42) के कितना करीब था। अलग-अलग जवाबों के नियम ये हैं:
42 है: "Correct"41 या 43 है: "So close"41 से कम है: "Too low"43 से ज़्यादा है: "Too high"अंदाज़ों के जवाब तय करने के लिए आपके पास चार काम हैं।
सही अंदाज़े का जवाब देने के लिए reply फंक्शन बनाइए:
reply(42)
// -> "Correct"
करीब के अंदाज़ों का जवाब देने के लिए reply फंक्शन बदलिए:
reply(41)
// -> "So close"
बहुत कम अंदाज़ों का जवाब देने के लिए reply फंक्शन बदलिए:
reply(25)
// -> "Too low"
बहुत ज़्यादा अंदाज़ों का जवाब देने के लिए reply फंक्शन बदलिए:
reply(88)
// -> "Too high"
Exercism पर साइन अप कीजिए और Gleam को 33 कॉन्सेप्ट122 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।