ट्रैक
/
Crystal
Crystal
/
अभ्यास
/
रसोई कैलकुलेटर
रसोई कैलकुलेटर

रसोई कैलकुलेटर

सीखने का अभ्यास

परिचय

टपल एलिमेंट का एक सीमित और क्रमबद्ध समूह होता है, जिसे बदला नहीं जा सकता। टपल में हर जगह का टाइप तय होना ज़रूरी है। यानी कंपाइलर को पता रहता है कि किस जगह पर कौन-सा टाइप है। टपल में हर जगह का टाइप अलग हो सकता है, लेकिन टाइप कंपाइल के समय पता होना चाहिए।

टपल बनाना

टपल की वैल्यू के टाइप कंपाइल करते समय पता चलते हैं या नहीं, इसके आधार पर टपल बनाने के अलग-अलग तरीके हैं। अगर वैल्यू कंपाइल के समय पता हों, तो टपल लिटरल सिंटैक्स से टपल बनाया जा सकता है। वरना टाइप साफ-साफ घोषित करना पड़ता है। यह भी ज़रूरी है कि वैल्यू के टाइप टपल में बताए गए टाइप से मेल खाएँ, और वैल्यू की संख्या भी बताए गए टाइप की संख्या के बराबर हो। टपल लिटरल सिंटैक्स से बनाने का एक उदाहरण देखिए:

tuple = {1, "foo", 'c'} # Tuple(Int32, String, Char)

Tuple क्लास की मदद से भी टपल बनाया जा सकता है।

tuple = Tuple(Int32, String, Char).new(1, "foo", 'c')

आप चाहें तो जिस वेरिएबल में टपल रखा है, उसका टाइप भी साफ-साफ लिख सकते हैं।

tuple : Tuple(Int32, String, Char) = {1, "foo", 'c'}

टपल का टाइप साफ-साफ लिखना काम आता है, क्योंकि इससे आप किसी जगह के लिए यूनियन टाइप तय कर सकते हैं। यानी एक जगह पर एक से अधिक टाइप की वैल्यू रखी जा सकती हैं।

tuple : Tuple(Int32 | String, String, Char) = {1, "foo", 'c'}

रूपांतरण

ऐरे से टपल बनाना

Tuple क्लास के from मेथड की मदद से आप ऐरे से टपल बना सकते हैं। इसके लिए टपल का टाइप बताना ज़रूरी है।

array = [1, "foo", 'c']
tuple = Tuple(Int32, String, Char).from(array)

ऐरे में रूपांतरण

to_a मेथड से आप टपल को ऐरे में बदल सकते हैं। नतीजे वाले ऐरे के एलिमेंट का टाइप, टपल की हर फील्ड के टाइप का यूनियन होता है।

tuple = {1, "foo", 'c'}
array = tuple.to_a
array # => [1, "foo", 'c']

एलिमेंट तक पहुँचना

ऐरे की तरह टपल भी शून्य से इंडेक्स होते हैं, यानी पहला एलिमेंट इंडेक्स 0 पर होता है। लेकिन ऐरे से अलग, टपल में हर एलिमेंट का टाइप तय होता है और कंपाइल के समय पता रहता है। इसलिए टपल में इंडेक्स करते समय एलिमेंट का टाइप उसकी जगह के हिसाब से तय होता है। टपल के किसी एलिमेंट तक पहुँचने के लिए आप [] ऑपरेटर इस्तेमाल कर सकते हैं।

array = [1, "foo", 'c']
array[0]         # => 1
typeof(array[0]) # => Int32 | String | Char

tuple = {1, "foo", 'c'}
tuple[0]         # => 1
typeof(tuple[0]) # => Int32

ऐरे से एलिमेंट निकालने और टपल से निकालने में एक और फर्क है। टपल में अगर इंडेक्स साफ लिखा हो, तो कंपाइलर जाँच लेता है कि इंडेक्स टपल की सीमा के अंदर है या नहीं। इसका मतलब है कि आपको रनटाइम एरर की जगह कंपाइल के समय ही एरर मिलती है।

tuple = {1, "foo", 'c'}
tuple[3]
# => Error: index out of bounds for Tuple(Int32, String, Char) (3 not in -3..2)

लेकिन अगर इंडेक्स किसी वेरिएबल में रखा हो, तो कंपाइलर कंपाइल के समय यह जाँच नहीं पाएगा कि इंडेक्स टपल की सीमा में है या नहीं। तब एरर रनटाइम पर मिलती है।

सबटपल

टपल से सबटपल पाने के लिए आप [] ऑपरेटर के साथ रेंज दे सकते हैं। इससे उन एलिमेंट वाला नया टपल लौटता है जो दी गई रेंज में आते हैं। रेंज कंपाइल के समय देनी होती है। वरना कंपाइलर को यह पता नहीं चलेगा कि सबटपल के एलिमेंट किस टाइप के हैं। यानी रेंज एक रेंज लिटरल होनी चाहिए, किसी वेरिएबल में रखी हुई नहीं।

tuple = {1, "foo", 'c'}
subtuple = tuple[0..1] # Tuple(Int32, String)

i = 0..1
tuple[i]
# Error: Tuple#[](Range) can only be called with range literals known at compile-time

टपल का उपयोग कब करें

जब आपको तय संख्या की वैल्यू एक साथ रखनी हों और उन वैल्यू के टाइप कंपाइल के समय पता हों, तब टपल काम आते हैं। ऐसा इसलिए, क्योंकि टपल को कम मेमोरी चाहिए और बदले न जा सकने की वजह से ये ऐरे से तेज़ होते हैं। एक और उपयोग है, मेथड से एक साथ कई वैल्यू लौटाना। यह तब खास तौर पर काम आता है जब वैल्यू के टाइप अलग-अलग हों, क्योंकि टपल में हर जगह का टाइप अलग हो सकता है।

जहाँ ज़रूरत ऐसे डेटा स्ट्रक्चर की हो जिसका आकार बढ़ता-घटता रहे या जिसे बार-बार बदलना पड़े, वहाँ टपल का उपयोग नहीं करना चाहिए।

सिंबल ऐसे नाम वाले आइडेंटिफायर होते हैं जिनसे किसी वैल्यू को दर्शाया जा सकता है। सिंबल सिंबल लिटरल से बनते हैं, यानी किसी नाम के आगे : अक्षर लगाकर, जैसे :foo। इन्हें कोट्स के साथ भी लिखा जा सकता है, जैसे :"foo"। इससे नाम में स्पेस जैसी चीज़ें भी रखी जा सकती हैं।

:foo           # => :foo
:"foo boo"     # => :"foo boo"
:foo == :"foo" # => true

भाषा में सिंबल कई जगह इस्तेमाल होते हैं, जैसे नेम्ड टपल की कीज़ में और मेथड तथा वेरिएबल के नाम दर्शाने में।

Crystal में सिंबल

Crystal में सिंबल Ruby से काफी अलग होते हैं। Crystal में सिंबल एक तरह का कॉन्स्टेंट होता है, इसलिए यह कंपाइल के समय असाइन होता है। इसका मतलब है कि सिंबल चलते-चलते नहीं बनाए जा सकते, जबकि Ruby में यह मुमकिन है।

Crystal में सिंबल Int32 के रूप में रखे जाते हैं, जिससे ये बहुत कुशल बनते हैं।

रूपांतरण

सिंबल को स्ट्रिंग में बदला जा सकता है, लेकिन स्ट्रिंग को सिंबल में नहीं। ऐसा इसलिए, क्योंकि सिंबल कंपाइल के समय बनते हैं और स्ट्रिंग रनटाइम पर।

:foo.to_s # => "foo"

निर्देश

अपने दोस्तों के लिए कुकीज़ बनाने की तैयारी में आपको पता चलता है कि रेसिपी में इस्तेमाल किए गए कुछ मापों को बदलना पड़ेगा। चूँकि आप केवल मीट्रिक प्रणाली से परिचित हैं, इसलिए अपनी सुविधा के लिए आपको अमेरिकी बेकिंग के आम मापों को मिलीलीटर (mL) में बदलने का कोई तरीका निकालना है।

अपने हल के लिए इस रूपांतरण चार्ट का इस्तेमाल कीजिए:

बदलने वाली इकाई वॉल्यूम मिलीलीटर (mL) में
mL 1 1
अमेरिकी कप 1 240
अमेरिकी द्रव औंस 1 30
अमेरिकी छोटा चम्मच 1 5
अमेरिकी बड़ा चम्मच 1 15

चूँकि आप एक प्रतिभाशाली प्रशिक्षु प्रोग्रामर हैं, आप मिलीलीटर को बीच की इकाई बनाने का फैसला करते हैं, ताकि सूची में दी गई किसी भी इकाई से किसी भी दूसरी इकाई में, या उसी इकाई में भी, बदलना आसान हो जाए।

1. वॉल्यूम-पेयर से संख्यात्मक भाग निकालिए

KitchenCalculator.get_volume मेथड बनाइए। इसे एक वॉल्यूम-पेयर टपल दिया जाए, तो यह केवल संख्यात्मक भाग लौटाता है।

KitchenCalculator.get_volume({:cup, 2.0})
# => 2.0

2. वॉल्यूम-पेयर को मिलीलीटर में बदलिए

KitchenCalculator.to_milliliter मेथड बनाइए। इसे एक वॉल्यूम-पेयर टपल दिया जाए, तो यह रूपांतरण चार्ट का इस्तेमाल करके उस वॉल्यूम को मिलीलीटर में बदल देता है।

KitchenCalculator.to_milliliter({:cup, 2.5})
# => {:milliliter, 600.0}

3. मिलीलीटर वाले वॉल्यूम-पेयर को दूसरी इकाई में बदलिए

KitchenCalculator.from_milliliter मेथड बनाइए। इसे एक वॉल्यूम-पेयर टपल और मनचाही इकाई दी जाए, तो यह रूपांतरण चार्ट का इस्तेमाल करके उस वॉल्यूम को मनचाही इकाई में बदल देता है।

KitchenCalculator.from_milliliter({:milliliter, 1320.0}, :cup)
# => {:cup, 5.5}

4. किसी भी इकाई से किसी भी इकाई में बदलिए

KitchenCalculator.convert मेथड बनाइए। इसे एक वॉल्यूम-पेयर टपल और मनचाही इकाई दी जाए, तो यह दिए गए वॉल्यूम को मनचाही इकाई में बदल देता है।

KitchenCalculator.convert({:teaspoon, 9.0}, :tablespoon)
# => {:tablespoon, 3.0}
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Crystal Exercism

रसोई कैलकुलेटर शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।