Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी प्रतीक क्या हैं और वे कैसे काम करते हैं?

एक प्रतीक इस तरह दिखता है:

: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 में प्रतीक जीसी पेश किया गया था

आशा है आपने कुछ नया सीखा होगा!

कृपया इस पोस्ट को शेयर करें ताकि यह अधिक लोगों तक पहुंच सके 🙂


  1. एक मैट्रिक्स क्या है और रूबी में इसका उपयोग कैसे करें?

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

  1. रूबी 2.6 में एमजेआईटी क्या है और यह कैसे काम करता है?

    रूबी के प्रदर्शन में बहुत सुधार हो रहा है, संस्करण दर संस्करण… और रूबी विकास टीम रूबी को और भी तेज बनाने के लिए हर संभव प्रयास कर रही है! इन प्रयासों में से एक 3×3 परियोजना है। लक्ष्य? रूबी 3.0, रूबी 2.0 से 3 गुना तेज होगा । इस प्रोजेक्ट का एक हिस्सा नया MJIT कंपाइलर है, जो इस लेख का विषय है। MJ

  1. Windows Sysinternals:वे क्या हैं और उनका उपयोग कैसे करें?

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