2013-04-22 5 views
8

रूबी ने डबल कोट्स ("") बनाम String.new के साथ एक नई स्ट्रिंग को कैसे शुरू किया है, इसमें क्या अंतर है? जिज्ञासा और प्रयोग प्रयोजनों के लिए, मैं String#initialize overrode:रूबी डबल कोट्स (उर्फ "") बनाम स्ट्रिंग.न्यू का मूल्यांकन कैसे करता है?

class String 
    def initialize 
    puts "I <3 bananas" # they're delicious! 
    end 
end 

क्या मैं यह पता लगाने की कोशिश कर रहा हूँ है: क्यों इन दो उदाहरणों अलग हैं?

# Calling the String class directly, I can declare banana love! 
irb(main):054:0> String.new 
I <3 bananas 
=> "" 

# Using double quotes, this string is not as tasty :(
irb(main):055:0> "" 
=> "" 

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

+1

यदि आप इसके बजाय 'आवंटित' ओवरराइड करते हैं तो क्या होता है? –

+2

@RyanBigg यह एक अच्छा विचार है, लेकिन इससे कोई फर्क नहीं पड़ता है। स्ट्रिंग अक्षर का मूल्यांकन किया जाता है और उनका ऑब्जेक्ट संकलित समय पर बनाया जाता है, दोनों 'प्रारंभिक' और 'आवंटित' दोनों को छोड़कर। –

+0

@ दशहन कॉम्पूटिंग, धन्यवाद! ऐसा लगता है जैसे मुझे प्रारंभिक सामग्री को वापस करने के लिए स्रोत से रुबी को हैक करना और पुनः संयोजित करना होगा। मैं साहित्यिक पर और अधिक पढ़ूंगा। – amorphid

उत्तर

9

Matz के अनुसार:

स्ट्रिंग वस्तुओं शाब्दिक के लिए पहले से ही संकलन समय है, जो दूर है इससे पहले कि आप इनिशियलाइज़ विधि को फिर से परिभाषित में बनाया जाता है। व्यक्तिगत स्ट्रिंग अक्षर से ऑब्जेक्ट्स पहले ही आवंटित और प्रारंभिक ऑब्जेक्ट्स की प्रतिलिपि हैं। शुरुआती विधि का पूरा उद्देश्य नए बनाए गए ऑब्जेक्ट्स को आरंभ करना है, जैसा कि नाम बताता है। मुझे को स्ट्रिंग अक्षरों के लिए प्रारंभिक विधि को फिर से परिभाषित करने की आवश्यकता नहीं है, जो संकलन समय पर पहले ही प्रारंभ हो चुकी है।

+0

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

संबंधित मुद्दे