एक सिम्बल ऐसा दिखता है:
:testing
कुछ लोग सिम्बल्स को वेरिएबल्स समझ लेते हैं, लेकिन उनका वेरिएबल्स से कोई लेना-देना नहीं है…
…एक सिम्बल स्ट्रिंग की तरह अधिक होता है।
तो रूबी सिम्बल्स और स्ट्रिंग्स में क्या अंतर है?
स्ट्रिंग्स का उपयोग डेटा के साथ काम करने के लिए किया जाता है।
सिम्बल्स पहचानकर्ता होते हैं।
यही मुख्य अंतर है:
सिम्बल्स केवल एक अन्य प्रकार के स्ट्रिंग नहीं हैं, उनका एक अलग उद्देश्य होता है।
सिम्बल्स का उपयोग कब करें
सिम्बल्स का सबसे आम उपयोग मेथड और इंस्टेंस वेरिएबल नामों को दर्शाने के लिए होता है।
उदाहरण:
attr_reader :title
attr_reader के बाद :title एक सिम्बल है जो @title इंस्टेंस वेरिएबल को दर्शाता है।
आप सिम्बल्स को हैश कुंजी के रूप में भी उपयोग कर सकते हैं।
उदाहरण:
hash = {a: 1, b: 2, c: 3} लाभ क्या हैं?
सिम्बल्स बेहतर दिखते हैं, वे अपरिवर्तनीय (immutable) हैं और यदि आप स्ट्रिंग कुंजियों बनाम सिम्बल कुंजियों को बेंचमार्क करते हैं तो आप पाएंगे कि स्ट्रिंग कुंजियाँ लगभग 1.70x धीमी होती हैं।
अपरिवर्तनीय से मेरा मतलब है कि प्रत्येक सिम्बल अद्वितीय होता है, और इसे बदला नहीं जा सकता:
:rubyguides.object_id # 437768 :rubyguides.object_id # 437768
ये दो सिम्बल्स एक ही ऑब्जेक्ट हैं क्योंकि उनका ऑब्जेक्ट आईडी समान है।
सिम्बल्स का उपयोग मेटाप्रोग्रामिंग मेथड्स जैसे send में किया जा सकता है:
[1,2,3].send(:first)
संक्षेप में:
आपको सिम्बल्स का उपयोग चीजों के नाम या लेबल के रूप में करना चाहिए (जैसे मेथड्स) और स्ट्रिंग्स का उपयोग तब करना चाहिए जब आप डेटा (व्यक्तिगत वर्णों) के बारे में अधिक परवाह करते हैं।
स्ट्रिंग्स और सिम्बल्स के बीच रूपांतरण
आप आवश्यकता पड़ने पर एक सिम्बल को स्ट्रिंग में बदल सकते हैं।
आप ऐसा क्यों करना चाहेंगे?
क्योंकि सिम्बल्स के पास केवल उन मेथड्स का सबसेट होता है जो एक स्ट्रिंग के पास होते हैं।
और सिम्बल्स को बदला नहीं जा सकता, इसलिए यदि आप सिम्बल के व्यक्तिगत वर्णों के साथ काम करना चाहते हैं तो आपको एक स्ट्रिंग चाहिए।
आप इसे to_s मेथड का उपयोग करके कर सकते हैं।
उदाहरण के लिए, method_missing का उपयोग करते समय आपको लापता मेथड का नाम सिम्बल के रूप में मिलता है। आप जांचना चाह सकते हैं कि यह मेथड नाम किसी निश्चित पैटर्न से मेल खाता है (जैसे ? में समाप्त होना)।
उदाहरण:
def method_missing(method_name, *args, &block) if method_name.to_s[-1] == "?" # कुछ करें else super end end
आप एक स्ट्रिंग ऑब्जेक्ट को सिम्बल ऑब्जेक्ट में भी बदल सकते हैं।
ऐसा करने का मेथड है String#to_sym:
"rubyguides".to_sym # :rubyguides
सिम्बल्स की एक सरणी बनाना
यदि आप सिम्बल्स की एक सरणी बनाना चाहते हैं तो आप इस कोड का उपयोग कर सकते हैं:
symbols = %i(a b c) # [:a, :b, :c]
यह आपको कॉलन और कॉमा टाइप करने से बचाता है।
स्ट्रिंग संस्करण %w के समान:
strings = %w(a b c) # ["a", "b", "c"]
रूबी सिम्बल्स वीडियो
सिम्बल GC (उन्नत)
सिम्बल्स के बारे में एक और दिलचस्प तथ्य यह है कि विभिन्न प्रकार के होते हैं।
कारण यह है कि रूबी 2.2 से पहले सिम्बल्स गार्बेज कलेक्ट नहीं होते थे, जिसका अर्थ है कि जब उनकी आवश्यकता नहीं होती थी तो उन्हें नियमित रूबी ऑब्जेक्ट्स (स्ट्रिंग्स, हैशेज, सरणियाँ…) की तरह मेमोरी से साफ नहीं किया जाता था।
आप यहां एक उदाहरण देख सकते हैं:
p Symbol.all_symbols.size # 2443 ('aa'..'aj').map(&:to_sym) GC.start p Symbol.all_symbols.size # 2453 आप देखेंगे कि सिम्बल्स की कुल संख्या 10 से बढ़ जाती है, जैसा कि आप उम्मीद करेंगे क्योंकि हम 10 नए सिम्बल्स बना रहे हैं।
लेकिन रूबी 2.2 से ये सिम्बल्स मेमोरी से हटा दिए जाते हैं क्योंकि वे अस्थायी हैं और इस कोड में किसी और चीज द्वारा उपयोग नहीं किए जा रहे हैं।
यदि आप इस कोड को सिम्बल GC सक्षम वाले रूबी संस्करण पर आज़माते हैं तो दोनों सिम्बल गणनाएँ समान होंगी।
कुछ सिम्बल्स कभी मेमोरी से नहीं हटाए जाते, इन्हें "अमर सिम्बल्स" कहा जाता है।
आप ObjectSpace मॉड्यूल का उपयोग करके उन्हें गिन सकते हैं:
require 'objspace' ObjectSpace.count_symbols # {:mortal_dynamic_symbol=>3, :immortal_dynamic_symbol=>5, :immortal_static_symbol=>3663, :immortal_symbol=>3668} ध्यान दें कि सीधे बनाए गए सिम्बल्स, जैसे :a1 स्वचालित रूप से अमर सिम्बल्स बन जाते हैं। एक नया मेथड बनाने से भी उसके साथ एक immortal_static_symbol बनेगा।
तो नश्वर सिम्बल्स कहाँ से आते हैं?
to_sym मेथड से स्ट्रिंग्स को सिम्बल्स में बदलने से।
आप इसे स्वयं ObjectSpace.count_symbols का उपयोग करके जांच सकते हैं।
और यदि आप सोच रहे हैं कि immortal_dynamic_symbol क्या है, यह एक सिम्बल है जिसे नश्वर से अमर में प्रोमोट किया गया है। यह तब हो सकता है जब आप एक नश्वर सिम्बल के नाम से एक मेथड बनाते हैं।
सारांश
इस लेख में आपने सीखा:
- सिम्बल्स अपरिवर्तनीय (immutable) हैं
- सिम्बल्स मानों के पॉइंटर नहीं हैं, वे स्वयं मान हैं
- स्ट्रिंग्स डेटा के लिए हैं और सिम्बल्स पहचान के लिए
- स्ट्रिंग्स और सिम्बल्स के बीच कैसे परिवर्तित करें
- रूबी 2.2 में सिम्बल GC पेश किया गया था ताकि अस्थायी सिम्बल्स को साफ किया जा सके
उम्मीद है आपने कुछ नया सीखा!
कृपया इस पोस्ट को शेयर करें ताकि यह अधिक लोगों तक पहुँच सके 🙂