एक प्रतीक इस तरह दिखता है:
:testing
कुछ लोग प्रतीकों को चर के साथ भ्रमित करते हैं, लेकिन उनका चर से कोई लेना-देना नहीं है…
…एक प्रतीक एक स्ट्रिंग की तरह बहुत अधिक है ।
तो रूबी प्रतीकों और स्ट्रिंग्स में क्या अंतर हैं?
स्ट्रिंग्स का उपयोग डेटा . के साथ कार्य करने के लिए किया जाता है ।
प्रतीक पहचानकर्ता . हैं ।
यही मुख्य अंतर है:
प्रतीक केवल दूसरे प्रकार के तार नहीं हैं, उनका एक अलग उद्देश्य है।
प्रतीकों का उपयोग कब करें
प्रतीकों के लिए सबसे आम उपयोगों में से एक है विधि और आवृत्ति चर नामों का प्रतिनिधित्व करना ।
उदाहरण :
attr_reader :title
:title
attr_reader के बाद एक प्रतीक है जो @title
. का प्रतिनिधित्व करता है आवृत्ति चर।
आप प्रतीकों का उपयोग हैश कुंजियों के रूप में भी कर सकते हैं।
उदाहरण :
hash = {a: 1, b: 2, c: 3}
लाभ?
प्रतीक बेहतर दिखते हैं, वे अपरिवर्तनीय हैं और यदि आप स्ट्रिंग कुंजियाँ बनाम प्रतीक कुंजियाँ बेंचमार्क करते हैं तो आप पाएंगे कि स्ट्रिंग कुंजियाँ लगभग 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] == "?" # do something 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 सक्षम है तो दोनों प्रतीकों की संख्या समान होगी।
कुछ प्रतीकों को स्मृति से कभी नहीं हटाया जाएगा, इन्हें "अमर प्रतीक" कहा जाता है।
आप ऑब्जेक्टस्पेस मॉड्यूल का उपयोग करके उन्हें गिन सकते हैं:
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
क्या है? , यह एक प्रतीक है जिसे नश्वर से अमर कर दिया गया है। ऐसा तब हो सकता है जब आप किसी नश्वर प्रतीक के नाम से कोई विधि बनाते हैं।
सारांश
इस लेख पर आपने सीखा:
- प्रतीक अपरिवर्तनीय होते हैं
- प्रतीक मूल्यों के सूचक नहीं हैं, वे स्वयं मूल्य हैं
- स्ट्रिंग डेटा के लिए हैं और प्रतीक पहचान के लिए हैं
- स्ट्रिंग्स और प्रतीकों के बीच कनवर्ट कैसे करें
- अस्थायी प्रतीकों को साफ करने के लिए रूबी 2.2 में प्रतीक जीसी पेश किया गया था
आशा है आपने कुछ नया सीखा होगा!
कृपया इस पोस्ट को शेयर करें ताकि यह अधिक लोगों तक पहुंच सके 🙂