सिंबल ऐसे आइडेंटिफायर होते हैं जिनका एक नाम होता है और जिन्हें किसी वैल्यू को दर्शाने के लिए इस्तेमाल किया जा सकता है।
सिंबल, सिंबल लिटरल से बनते हैं। इसमें नाम से पहले : अक्षर लगाया जाता है, जैसे :foo.
इन्हें कोट्स के साथ भी लिखा जा सकता है, जैसे :"foo"। इससे नाम में स्पेस जैसी चीज़ें भी रखी जा सकती हैं।
:foo # => :foo
:"foo boo" # => :"foo boo"
इस भाषा में सिंबल कई जगहों पर इस्तेमाल होते हैं, जैसे हैश में की के तौर पर, और मेथड तथा वेरिएबल के नाम दर्शाने के लिए।
सिंबल स्ट्रिंग से अलग इसलिए हैं क्योंकि ये आइडेंटिफायर होते हैं, कोई डेटा या टेक्स्ट नहीं। इसका मतलब है कि एक ही नाम वाले दो सिंबल हमेशा एक ही ऑब्जेक्ट होते हैं।
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
सिंबल अपरिवर्तनीय होते हैं, यानी इन्हें बदला नहीं जा सकता। इसका मतलब है कि जब आप किसी सिंबल को "बदलते" हैं, तो वास्तव में एक नया सिंबल बनता है। सिंबल को बदलने के लिए कुछ मेथड मौजूद हैं, और ये सभी नया सिंबल लौटाते हैं। सभी मेथड सिंबल API में मिलते हैं।
:foo.upcase # => :FOO
:foo.object_id # => 1086748
:foo.upcase.object_id # => 60
सिंबल अपरिवर्तनीय होते हैं, इसका फायदा यह है कि ये स्ट्रिंग की तुलना में कम मेमोरी लेते हैं, और आइडेंटिफायर के तौर पर इस्तेमाल करना भी ज़्यादा सुरक्षित होता है।
सिंबल को स्ट्रिंग में बदला जा सकता है, और स्ट्रिंग को सिंबल में।
यह तब काम आता है जब आप किसी सिंबल में बदलाव करना चाहते हैं, या किसी सिंबल को स्ट्रिंग की तरह इस्तेमाल करना चाहते हैं।
किसी स्ट्रिंग को सिंबल बनाने के लिए String#to_sym मेथड इस्तेमाल कीजिए, और इसका उल्टा करने के लिए Symbol#to_s मेथड।
सिंबल पर उपलब्ध मेथड की संख्या सीमित है। इसलिए जब किसी नए सिंबल की ज़रूरत हो, तो सिंबल को स्ट्रिंग में बदलकर उस पर स्ट्रिंग के मेथड इस्तेमाल करना काम आ सकता है।
:foo.to_s # => "foo"
"foo".to_sym # => :foo
पलेर्मो का बंदरगाह बहुत व्यस्त रहता है, जहाँ ढेरों जहाज़ आते-जाते रहते हैं। यहाँ लंबे समय से एक हाथ से चलने वाला सिस्टम चल रहा था, जो बंदरगाह में मौजूद जहाज़ों का हिसाब रखता था। इस सिस्टम में गलतियाँ बहुत होती हैं, इसलिए बंदरगाह के मुखिया ने तय किया है कि इसकी जगह कंप्यूटर से चलने वाला सिस्टम लगाया जाए।
बंदरगाह के मुखिया ने यह नया सिस्टम लागू करने का काम आपको सौंपा है। इस सिस्टम को जहाज़ों के आइडेंटिफायर संभालने हैं, और गंतव्यों के भी।
सबसे पहले आपको पलेर्मो के बंदरगाह का आइडेंटिफायर बनाना है। आइडेंटिफायर बंदरगाह के नाम के पहले चार अक्षर होते हैं, जो बड़े अक्षरों में लिखे जाते हैं।
Port::IDENTIFIER कॉन्स्टेंट को :PALE वैल्यू वाला सिंबल बनाइए।
Port::IDENTIFIER
# => :PALE
प्रोग्राम को दूसरे बंदरगाह भी संभालने होंगे, इसलिए आपको उनके लिए भी आइडेंटिफायर बनाने होंगे। बंदरगाह चाहता है कि यह सिस्टम अपने आप चले, और क्योंकि अलग-अलग बंदरगाहों के नाम रखने के तरीके अलग-अलग होते हैं, इसलिए आइडेंटिफायर बंदरगाह के नाम से ही बनाए जाने चाहिए। आइडेंटिफायर बंदरगाह के नाम के पहले चार अक्षर होते हैं, जो बड़े अक्षरों में लिखे जाते हैं।
Port.get_identifier मेथड ऐसा बनाइए कि वह एक स्ट्रिंग को आर्गुमेंट के रूप में ले और उस बंदरगाह का आइडेंटिफायर एक सिंबल के रूप में लौटाए।
Port.get_identifier("Hamburg")
# => :HAMB
बंदरगाह पर दो टर्मिनल हैं, और सिस्टम को यह तय करना है कि किसी जहाज़ को किस टर्मिनल पर लगना चाहिए। टर्मिनल जहाज़ के आइडेंटिफायर से तय होता है।
यह आइडेंटिफायर 2 हिस्सों से बनता है। पहला हिस्सा 3 बड़े अक्षरों का होता है, जो बताते हैं कि जहाज़ कौन-सा कार्गो ले जा रहा है, और उसके बाद 3 संख्याएँ आती हैं, जो उस जहाज़ का खास आइडेंटिफायर होती हैं।
अगर जहाज़ के आइडेंटिफायर में OIL या GAS लिखा हो, तो जहाज़ को टर्मिनल A पर लगना चाहिए। बाकी सभी जहाज़ों को टर्मिनल B पर लगना चाहिए।
Port.get_terminal मेथड ऐसा बनाइए कि वह एक सिंबल को आर्गुमेंट के रूप में ले, जो जहाज़ का आइडेंटिफायर हो।
यह मेथड टर्मिनल को एक सिंबल के रूप में लौटाना चाहिए।
Port.get_terminal(:OIL123)
# => :A
Exercism पर साइन अप कीजिए और Ruby को 21 कॉन्सेप्ट121 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।