तो, रूबी रचनाकारों को symbols
भाषा में अवधारणा का उपयोग क्यों करना पड़ा ?
खैर, उन्होंने सख्ती से "करने के लिए" नहीं किया, उन्होंने चुना। यह भी ध्यान दें कि कड़ाई से बोलना Symbol
भाषा का हिस्सा नहीं है, वे मुख्य पुस्तकालय का हिस्सा हैं। वे करते भाषा स्तरीय शाब्दिक वाक्य रचना है, लेकिन वे बस के रूप में अच्छी तरह से काम लेंगे, जब आप फोन करके उन्हें निर्माण करने के लिए किया था Symbol::new
।
मैं एक गैर-रूबी प्रोग्रामर के दृष्टिकोण से इसे समझने की कोशिश कर रहा हूं। मैंने बहुत सी अन्य भाषाएं सीखी हैं और उनमें से किसी में भी यह निर्दिष्ट करने की आवश्यकता नहीं है कि मैं रूबी कॉल के साथ काम कर रहा था या नहीं symbols
।
आपने यह नहीं बताया कि "अन्य भाषाओं के बहुत सारे" क्या हैं, लेकिन यहाँ भाषाओं का एक छोटा सा अंश है जिसमें Symbol
रूबीज़ की तरह डेटाटाइप है
- ECMAScript , जावास्क्रिप्ट भी
- स्काला
- स्कीम , कॉमन लिस्प , क्लूजुर (भी, क्लोजर के कीवर्ड हैं ), मूल रूप से लिस्प परिवार की हर भाषा, इसके उत्तराधिकारी और चचेरे भाई हैं
- स्मॉलटॉक परिवार में स्मॉलटॉक , न्यूजक , और कई अन्य भाषाएं (संभवत: रूबी उनसे मिली), जिसमें ऑब्जेक्टिव-सी (यद्यपि सीमित रूप में)
- एरलंग ( परमाणु कहा जाता है ) , एलिक्सिर और एलएफई भी
- जूलिया
- प्रोलोग (जिन्हें परमाणु कहा जाता है ), जो कि संभव है कि एर्लैंग उन्हें कहां से मिला था
अन्य भाषाएं भी हैं जो Symbol
अलग रूप में एस की विशेषताएं प्रदान करती हैं । उदाहरण के लिए, जावा में, रूबी की सुविधाओं String
को दो (वास्तव में तीन) प्रकारों में विभाजित किया गया है: String
और StringBuilder
/ StringBuffer
। दूसरी ओर, रूबी के Symbol
प्रकार की विशेषताओं को जावा String
प्रकार में बदल दिया जाता है : जावा String
एस को नजरअंदाज किया जा सकता है , शाब्दिक तार और String
एस जो संकलन-समय मूल्यांकन किए गए निरंतर अभिव्यक्तियों का परिणाम होते हैं, स्वचालित रूप से नजरबंद कर दिए जाते हैं, गतिशील रूप से उत्पन्न String
एस को कॉल करके नजरबंद किया जा सकता है। String.intern
विधि। String
जावा में इंटर्न बिल्कुल Symbol
रूबी में एक जैसा है , लेकिन इसे एक अलग प्रकार के रूप में लागू नहीं किया गया है, यह सिर्फ एक अलग स्थिति है कि एक जावाString
में हो सकता है (नोट: रूबी के पुराने संस्करणों में, String#to_sym
कहा जाता था String#intern
और यह विधि आज भी एक विरासत उर्फ के रूप में मौजूद है।)
मुख्य प्रश्न यह हो सकता है: क्या symbols
रूबी की अवधारणा स्वयं और अन्य भाषाओं के प्रदर्शन के इरादे के रूप में मौजूद है,
Symbol
s पहले और विशिष्ट शब्दार्थ के साथ डेटाटाइप हैं । ये शब्दार्थ कुछ प्रदर्शनकारी कार्यों (जैसे तेज़ ओ (1) समानता परीक्षण) को लागू करना संभव बनाते हैं, लेकिन यह मुख्य उद्देश्य नहीं है।
या सिर्फ कुछ ऐसा है जो भाषा के लिखे जाने के कारण अस्तित्व में है?
Symbol
s रूबी भाषा में बिलकुल भी आवश्यक नहीं हैं, रूबी उनके बिना ही ठीक काम करेगी। वे विशुद्ध रूप से एक पुस्तकालय सुविधा है। भाषा में ठीक एक स्थान है जो Symbol
s से बंधा है : एक def
विधि परिभाषा अभिव्यक्ति Symbol
उस पद्धति के नाम को दर्शाने के लिए मूल्यांकन करती है जिसे परिभाषित किया जा रहा है। हालाँकि, यह एक हालिया बदलाव है, इससे पहले, वापसी मूल्य केवल अनिर्दिष्ट था। एमआरआई ने केवल मूल्यांकन किया nil
, रुबिनियस ने किसी Rubinius::CompiledMethod
वस्तु का मूल्यांकन किया , और इसी तरह। यह भी मूल्यांकन करना संभव होगा UnboundMethod
… या सिर्फ ए String
।
क्या रूबी में एक कार्यक्रम हल्का और / या उससे अधिक तेज होगा, जो कहता है, पायथन या नोड समकक्ष? यदि हां, तो क्या इसकी वजह होगी symbols
?
मुझे यकीन नहीं है कि आप यहां क्या पूछ रहे हैं। प्रदर्शन ज्यादातर कार्यान्वयन गुणवत्ता का विषय है, भाषा का नहीं। इसके अलावा, नोड भी एक भाषा नहीं है, यह ECMAScript के लिए एक व्यवस्थित I / O ढांचा है। IronPython और MRI पर एक समान स्क्रिप्ट चलाने से, IronPython के तेज होने की संभावना है। CPython और JRuby + Truffle पर एक समान स्क्रिप्ट चलाने से JRuby + Truffle के तेज़ी से चलने की संभावना है। यह Symbol
एस के साथ कुछ भी नहीं है लेकिन कार्यान्वयन की गुणवत्ता के साथ है: JRuby + Truffle में आक्रामक रूप से अनुकूलन करने वाला कंपाइलर है, साथ ही उच्च प्रदर्शन वाले JVM का संपूर्ण अनुकूलन तंत्र, CPython एक सरल दुभाषिया है।
चूंकि रूबी का एक इरादा इंसानों के लिए पढ़ना और लिखना आसान है, क्या इसके निर्माता दुभाषिया में उन सुधारों को लागू करके कोडिंग की प्रक्रिया को आसान नहीं बना सकते थे (जैसा कि अन्य भाषाओं में हो सकता है)?
सं Symbol
। कंपाइलर ऑप्टिमाइज़ेशन नहीं हैं। वे विशिष्ट शब्दार्थ के साथ एक अलग डेटाटाइप हैं। वे YARV की तरह नहीं हैं flonums है, जिसके लिए एक निजी आंतरिक अनुकूलन कर रहे हैं Float
रों। स्थिति समान नहीं है Integer
, Bignum
और Fixnum
, जो एक अदृश्य निजी आंतरिक अनुकूलन विवरण होना चाहिए , लेकिन दुर्भाग्य से नहीं है। (यह अंत में रूबी 2.4 में तय होने जा रहा है, जो हटाता है Fixnum
और Bignum
बस छोड़ देता है Integer
।)
इसे करने का तरीका जावा करता है, सामान्य String
एस के एक विशेष राज्य के रूप में इसका मतलब है कि आपको हमेशा इस बात से सावधान रहने की आवश्यकता है कि आपका String
एस उस विशेष स्थिति में है या नहीं और किन परिस्थितियों में वे स्वचालित रूप से उस विशेष स्थिति में हैं और कब नहीं। यह एक अलग डेटाटाइप होने की तुलना में बहुत अधिक बोझ है।
क्या प्रतीकों की एक भाषा-अज्ञेय परिभाषा होगी और उन्हें अन्य भाषाओं में रखने का एक कारण होगा?
Symbol
नाम और लेबल की अवधारणा को दर्शाता है कि एक डेटा प्रारूप है । Symbol
s मूल्य वस्तुएं हैं , अपरिवर्तनीय, आमतौर पर तत्काल (यदि भाषा ऐसी चीज़ को अलग करती है), स्टेटलेस, और कोई पहचान नहीं है। दो Symbol
एस विच समान हैं, समान होने की गारंटी भी है, दूसरे शब्दों में, दो Symbol
एस जो समान हैं वास्तव में एक ही हैं Symbol
। इसका मतलब यह है कि मूल्य समानता और संदर्भ समानता एक ही चीज है, और इस तरह समानता कुशल और ओ (1) है।
किसी भाषा में उनके होने के कारण वास्तव में एक ही हैं, भाषा से स्वतंत्र। कुछ भाषाएं दूसरों की तुलना में उन पर अधिक भरोसा करती हैं।
उदाहरण के लिए, लिस्प परिवार में, "चर" की कोई अवधारणा नहीं है। इसके बजाय, आप Symbol
मूल्यों से जुड़े हैं।
चिंतनशील या आत्मविश्लेषी क्षमताओं के साथ भाषाओं में, Symbol
रों अक्सर रूबी में, प्रतिबिंब एपीआई में परिलक्षित संस्थाओं के नाम निरूपित करने के लिए जैसे, उपयोग किया जाता है Object#methods
, Object#singleton_methods
, Object#public_methods
, Object#protected_methods
, और Object#public_methods
एक वापसी Array
की Symbol
है (हालांकि वे बस के रूप में अच्छी तरह से एक वापसी कर सकता है Array
की Method
रों)। एक तर्क के रूप में भेजने के लिए संदेश के नाम को दर्शाते हुए Object#public_send
लेता है Symbol
(हालाँकि यह एक String
रूप में अच्छी तरह से स्वीकार करता है , Symbol
अधिक अर्थपूर्ण रूप से सही है)।
ECMAScript में, भविष्य में ECMAScript क्षमता को सुरक्षित बनाने का Symbol
एक मूलभूत निर्माण खंड है। वे प्रतिबिंब में भी बड़ी भूमिका निभाते हैं।