"फ्रोजन" इस बारे में नहीं है कि स्ट्रिंग का मूल्यांकन एक से अधिक बार किया जाता है या नहीं। यह है, आप सही हैं, mutability के बारे में।
एक स्ट्रिंग अक्षर का मूल्यांकन किया जाएगा, जिसमें हर बार लाइन का सामना करना पड़ता है।
इसे केवल एक बार मूल्यांकन करने के लिए (केवल) तरीका है, इसे एक स्रोत कोड की एक पंक्ति में डालना है जिसे केवल लूप में बजाय एक बार निष्पादित किया जाता है। एक लूप (या स्रोत कोड के किसी भी अन्य भाग) में एक स्ट्रिंग शब्दशः हमेशा मूल्यांकन किया जाएगा जब प्रोग्राम प्रवाह में स्रोत कोड की लाइन निष्पादित की जाती है।
यह वास्तव में एक अलग बात है कि यह जमे हुए/अपरिवर्तनीय है या नहीं, एक बार मूल्यांकन किया गया है।
स्वीकार्य उत्तर भ्रामक है। "यह अधिक है जैसे दुभाषिया यह तय कर सकता है कि स्ट्रिंग का मूल्य इसका मूल्यांकन करने से पहले क्या होगा।" नहीं। हर्गिज नहीं। इसे मूल्यांकन करने की जरूरत है। यदि स्ट्रिंग जमे हुए है, तो एक बार इसका मूल्यांकन होने के बाद, यह स्मृति में उसी स्थान का उपयोग करेगा और उसी ऑब्जेक्ट/object_id (जो एक ही चीज़ कहने के दो तरीके हैं) अन्य सभी समकक्ष तारों के रूप में। लेकिन अभी भी इंटरपोलेशन के साथ या बिना मूल्यांकन किया जा रहा है।
(इंटरपोलेशन के बिना, एक स्ट्रिंग अक्षर का 'मूल्यांकन' बहुत तेज़ है। सरल इंटरपोलेशन के साथ यह आमतौर पर बहुत तेज़ होता है। आप निश्चित रूप से एक महंगी विधि को कॉल करने के लिए इंटरपोलेशन का उपयोग कर सकते हैं, हालांकि, hypothetically)।
इंटरपोलेशन के बिना, मैं इसके बारे में चिंता नहीं करता। इंटरपोलेशन के साथ, यदि आपको लगता है कि आपका इंटरपोलेशन महंगा है तो आप इसे लूप में नहीं करना चाहते हैं - इसे टालने का एकमात्र तरीका लूप में ऐसा नहीं करना है, लेकिन लूप के बाहर एक बार स्ट्रिंग बनाएं।
रूबी दस्तावेज़ शायद "शाब्दिक स्ट्रिंग्स" के बजाय "स्ट्रिंग अक्षर" के बारे में बात करते हैं। ए "स्ट्रिंग शाब्दिक" स्रोत कोड में बाइट्स द्वारा बनाई गई कोई भी स्ट्रिंग है (''
, ""
, %Q[]
, या रूबी में स्रोत कोड में स्ट्रिंग अक्षर बनाने के अन्य तरीकों का उपयोग करके)। इंटरपोलेशन के साथ या बिना।
तो स्ट्रिंग्स द्वारा बनाए गए किस प्रकार के स्ट्रिंग्स नहीं हैं? खैर, एक स्ट्रिंग उदाहरण के लिए फ़ाइल या नेटवर्क से बाइट्स में पढ़कर बनाई गई है। या मौजूदा स्ट्रिंग को लेकर एक विधि को कॉल करके बनाई गई स्ट्रिंग जो some_string.dup
जैसी प्रतिलिपि लौटाती है। "स्ट्रिंग शाब्दिक" का अर्थ बाहरी इनपुट से पढ़ने के बजाय, स्रोत कोड में शाब्दिक रूप से बनाई गई स्ट्रिंग है। http://ruby-doc.org/core-2.1.1/doc/syntax/literals_rdoc.html
आपका उत्तर 2. सही दिखता है, और रूबी का व्यवहार (आपका जवाब नहीं) मुझे भ्रमित कर रहा है। यह मामला कैसे हो सकता है कि "दुभाषिया तय कर सकता है" '# {'foo'} 'लेकिन' '{}' नहीं? उत्तरार्द्ध भी आसान है। – sawa
@sawa, अभी भी सुनिश्चित नहीं है, कोड देखेंगे। मेरा अनुमान होगा कि वे बस '# {}" मामले को संभाल नहीं पाएंगे क्योंकि कोई भी इसका उपयोग नहीं करेगा। – ndn
मुझे आपका जवाब पसंद है, लेकिन मैं आपके लिए या किसी और के लिए थोड़ा जवाब देना चाहता हूं 2. – sawa