Crystal में कंट्रोल एक्सप्रेशन होते हैं, जिनसे तय किया जाता है कि प्रोग्राम कैसे चलेगा, और ये ट्रूथी या फॉल्सी वैल्यू लेते हैं। कुछ ऑपरेटर ऐसे भी हैं जिनसे ट्रूथी या फॉल्सी वैल्यू बनाई जा सकती हैं, इन्हें समानता और तुलना के ऑपरेटर कहते हैं।
मुख्य रूप से दो कंट्रोल एक्सप्रेशन हैं जिनसे तय होता है कि कौन-सा कोड चलेगा और कौन-सा नहीं। यानी यह भी कि कौन-सी शाखा चलेगी।
ये दो हैं: if और unless एक्सप्रेशन।
तुलना के ऑपरेटर वैल्यू की तुलना करने और true या false वैल्यू लौटाने के लिए इस्तेमाल होते हैं।
इन ऑपरेटरों से तुलना करने के लिए एक ही डेटा टाइप की दो वैल्यू चाहिए।
अगर वैल्यू एक ही डेटा टाइप की नहीं हैं, तो कंपाइलर एक एरर देता है।
यहाँ तुलना के ऑपरेटरों की सूची दी गई है, साथ में एक उदाहरण कि वे कब true वैल्यू देते हैं:
| मेथड | विवरण | उदाहरण |
|---|---|---|
| < | से कम | 4 < 5 |
| <= | से कम या बराबर | 4 <= 4 |
| > | से अधिक | 3 > 1 |
| >= | से अधिक या बराबर | 2 >= 2 |
समानता के ऑपरेटर तुलना के ऑपरेटरों जैसे ही हैं, लेकिन इनसे यह जाँचा जाता है कि दो वैल्यू बराबर हैं या नहीं।
== ऑपरेटर जाँचता है कि दो वैल्यू बराबर हैं या नहीं, और साथ ही वैल्यू का डेटा टाइप भी देखता है।
अगर वैल्यू समान हैं तो यह true लौटाता है, वरना false लौटाता है।
== ऑपरेटर किसी भी डेटा टाइप की वैल्यू की तुलना किसी भी दूसरे डेटा टाइप की वैल्यू से कर सकता है।
!= भी इसी तरह काम करता है, लेकिन अगर वैल्यू बराबर नहीं हैं तो यह true लौटाता है और बराबर हैं तो false।
if स्टेटमेंटif स्टेटमेंट से जाँचा जाता है कि दी गई शर्त ट्रूथी है या फॉल्सी।
अगर शर्त ट्रूथी है तो if स्टेटमेंट के अंदर का कोड चलेगा।
if स्टेटमेंट end कीवर्ड पर खत्म होता है।
if 1 == 1
puts "1 is equal to 1"
end
# => 1 is equal to 1
if 1 > 2
puts "1 is greater than 2"
end
# => no output
unless स्टेटमेंटunless स्टेटमेंट लगभग if स्टेटमेंट की तरह ही काम करता है, लेकिन अगर शर्त फॉल्सी है तो यह unless स्टेटमेंट के अंदर का कोड चलाता है।
unless 1 == 1
puts "1 is not equal to 1"
end
# => no output
unless 1 > 2
puts "1 is not greater than 2"
end
# => 1 is not greater than 2
else स्टेटमेंटelse स्टेटमेंट को if और unless स्टेटमेंट के साथ इस्तेमाल किया जा सकता है।
अगर if शाखा या unless शाखा नहीं चलती, तो else स्टेटमेंट चलता है।
हालाँकि `else` शाखा का इस्तेमाल `unless,` के साथ किया जा सकता है, लेकिन ऐसा करने की सलाह नहीं दी जाती, क्योंकि इससे कोड पढ़ने में आसानी कम हो जाती है।
इसके बजाय `else` शाखा के साथ `if !condition` इस्तेमाल करने की सलाह दी जाती है।
if 1 == 1
puts "1 is equal to 1"
else
puts "1 is not equal to 1"
end
# => 1 is equal to 1
unless 1 < 2
puts "1 is not greater than 2"
else
puts "1 is greater than 2"
end
# => 1 is greater than 2
elsif स्टेटमेंट को if स्टेटमेंट के साथ इस्तेमाल किया जा सकता है।
elsif स्टेटमेंट तब चलता है जब if शाखा नहीं चलती और elsif स्टेटमेंट की शर्त ट्रूथी होती है।
elsif स्टेटमेंट एक के बाद एक जोड़े जा सकते हैं, और जिस स्टेटमेंट की शर्त सबसे पहले ट्रूथी होती है, वही चलता है।
if स्टेटमेंट के अंत में एक else स्टेटमेंट भी हो सकता है, जो तब चलेगा जब पहले का कोई भी स्टेटमेंट सही न हुआ हो।
if 1 != 1
puts "1 is not equal to 1"
elsif 1 > 2
puts "1 is greater than 2"
else
puts "1 is not equal to 1 and 1 is not greater than 2"
end
# => 1 is not equal to 1 and 1 is not greater than 2
जब वेरिएबल को अलग-अलग डेटा टाइप की वैल्यू असाइन की जाती हैं, तो वेरिएबल दोनों डेटा टाइप रखता है। ऐसा इसलिए होता है क्योंकि कंपाइलर को पता नहीं होता कि कौन-सी शाखा चलेगी। इस एक से अधिक असाइनमेंट को, जिसे यूनियन भी कहा जाता है, आगे के कॉन्सेप्ट में समझाया जाएगा। यह नीचे दिए उदाहरण में देखा जा सकता है:
if 1 == 1
a = 1
else
a = "1"
end
typeof(a) # => Int32 | String
Crystal में एक टर्नरी ऑपरेटर होता है, जो एक ही लाइन में लिखा जाने वाला if-else स्टेटमेंट है: condition ? expression_if_truthy : expression_if_falsey
1 == 1 ? puts("1 is equal to 1") : puts("1 is not equal to 1")
# => 1 is equal to 1
इस अभ्यास में हम एक परमाणु रिएक्टर के लिए एक सरल नियंत्रण प्रणाली बनाएँगे।
रिएक्टर को पावर पैदा करने के लिए क्रिटिकैलिटी की स्थिति में होना ज़रूरी है। अगर रिएक्टर क्रिटिकैलिटी से कम की स्थिति में है, तो उसे नुकसान पहुँच सकता है। अगर रिएक्टर की स्थिति क्रिटिकैलिटी से आगे बढ़ जाती है, तो वह ओवरलोड हो सकता है और उसका मेल्टडाउन हो सकता है। हम मेल्टडाउन की संभावना कम करना चाहते हैं और रिएक्टर की स्थिति को ठीक से संभालना चाहते हैं।
नीचे दिए गए तीनों काम आदर्श रिएक्टर स्थिति बनाए रखने वाला कोड लिखने से जुड़े हैं।
किसी भी नियंत्रण प्रणाली को सबसे पहले यह देखना होता है कि रिएक्टर क्रिटिकैलिटी में संतुलित है या नहीं। अगर रिएक्टर नीचे दी गई शर्तें पूरी करता है, तो उसे क्रिटिकल कहा जाता है:
Reactor.criticality_balanced? नाम का मेथड बनाइए, जो केल्विन में मापा गया temperature और neutrons_emitted पैरामीटर के रूप में लेता है। अगर क्रिटिकैलिटी की शर्तें पूरी होती हैं तो यह true लौटाता है, वरना false।
Reactor.criticality_balanced?(750, 600)
# => true
रिएक्टर के पावर पैदा करना शुरू करने के बाद उसकी दक्षता तय करनी होती है। दक्षता को 4 बैंडों में बाँटा जा सकता है:
green -> 80% या उससे अधिक की दक्षता,orange -> 80% से कम पर कम से कम 60% की दक्षता,red -> 60% से कम, पर फिर भी 30% या उससे अधिक की दक्षता,black -> 30% से कम की दक्षता।प्रतिशत वैल्यू की गणना (generated_power/theoretical_max_power)*100 से की जा सकती है, जहाँ generated_power = voltage * current है।
ध्यान दीजिए कि प्रतिशत वैल्यू आम तौर पर पूर्णांक संख्या नहीं होती, इसलिए < और <= तुलनाओं के सही इस्तेमाल का ध्यान रखिए।
Reactor.reactor_efficiency नाम का मेथड बनाइए, जो तीन पैरामीटर लेता है: voltage, current और theoretical_max_power।
यह फंक्शन रिएक्टर का दक्षता बैंड लौटाना चाहिए: "green", "orange", "red", या "black"।
Reactor.reactor_efficiency(200,50,15000)
# => "orange"
आपके अंतिम काम में ओवरलोड और मेल्टडाउन से बचने के लिए एक फेल-सेफ तंत्र बनाना है। यह तंत्र तय करेगा कि रिएक्टर आदर्श क्रिटिकैलिटी थ्रेशोल्ड से नीचे है, उस पर है, या उससे ऊपर है। इसके बाद रिएक्टर में कंट्रोल रॉड डालकर (या निकालकर) क्रिटिकैलिटी को बढ़ाया, घटाया या रोका जा सकता है।
Reactor.fail_safe() नाम का मेथड बनाइए, जो 3 पैरामीटर लेता है: केल्विन में मापा गया temperature, neutrons_produced_per_second और threshold, और रिएक्टर के लिए एक स्टेटस कोड देता है।
अगर temperature * neutrons_produced_per_second, threshold के 90% से कम है, तो "LOW" स्टेटस कोड दीजिए, जो बताता है कि पावर पैदा करने के लिए कंट्रोल रॉड निकालना ज़रूरी है।
अगर temperature * neutrons_produced_per_second, threshold के 10% कम या ज़्यादा के भीतर है, तो रिएक्टर क्रिटिकैलिटी में है और "NORMAL" स्टेटस कोड दिया जाना चाहिए, जो बताता है कि रिएक्टर अनुकूल स्थिति में है और कंट्रोल रॉड अपनी आदर्श जगह पर हैं।
अगर temperature * neutrons_produced_per_second ऊपर बताई गई रेंज में नहीं है, तो रिएक्टर का मेल्टडाउन होने वाला है और रिएक्टर को तुरंत बंद करने के लिए "DANGER" स्टेटस कोड देना ज़रूरी है।
temperature = 1000
neutrons_produced_per_second = 30
threshold = 5000
Reactor.fail_safe(temperature, neutrons_produced_per_second, threshold)
# => "DANGER"
Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।