2014-04-18 18 views
6

मैं एक ट्यूटोरियल के माध्यम से अभी काम कर रहा हूँ, और मैं समझने के लिए क्यों निम्नलिखित होता है करना चाहते हैं:`<<` रूबी स्ट्रिंग में क्यों संलग्न होता है जबकि `+ =` नहीं होता है?

original_string = "Hello, " 
hi = original_string 
there = "World" 
hi += there 
assert_equal "Hello, ", original_string 

original_string = "Hello, " 
hi = original_string 
there = "World" 
hi << there 
assert_equal "Hello, World", original_string 

क्यों +=original_string पर कोई प्रभाव नहीं होता है, और << करता है? मैं बिल्कुल निश्चित था कि दूसरा मामला "Hello, " के बराबर होगा, लेकिन ऐसा नहीं है।

पहले उदाहरण में hi = original stringhi में original_string के मान की प्रतिलिपि करने के लिए प्रकट होता है, लेकिन hi = original string में दूसरा उदाहरण original string रूप में एक ही स्ट्रिंग को इंगित करने के hi स्थापित करने के लिए प्रकट होता है। मुझे लगता है कि दृश्यों की प्रतिलिपि बनाने या संदर्भ की प्रतिलिपि बनाने के लिए दृश्यों के पीछे कुछ प्रकार का निहित निर्णय है ... या कुछ।

उत्तर

1

आप स्ट्रिंग कक्षा के लिए रूबी प्रलेखन की जांच करनी चाहिए: जबकि += एक कॉपी बन जाती है और उस रिटर्न

String#+ method

String#<< method

3

<< स्ट्रिंग पर मूल वस्तु mutates।

नीचे संबंधित तार के object_id देखें: लाइन 35. पर

2.1.1 :029 > original_string = "Hello, " 
=> "Hello, " 
2.1.1 :030 > hi = original_string 
=> "Hello, " 
2.1.1 :031 > there = "World" 
=> "World" 
2.1.1 :032 > original_string.object_id 
=> 70242326713680 
2.1.1 :033 > hi.object_id 
=> 70242326713680 

2.1.1 :034 > hi += there 
=> "Hello, World" 
2.1.1 :035 > hi.object_id 
=> 70242325614780 

नोट अलग object_idhi पर एक बार जब आप ऊपर अपने उदाहरण में original_string को hi रीसेट करें, और << उपयोग करें, यह एक ही वस्तु को संशोधित करता है ।

3

दोनों उदाहरणों में, hi = original_string संदर्भ की प्रतिलिपि बनाएँ।

+= के साथ, हालांकि, आप एक नई स्ट्रिंग को इंगित करने के लिए hi को पुन: असाइन करते हैं, भले ही परिवर्तनीय नाम समान है।

ऐसा इसलिए है क्योंकि hi += there अभिव्यक्ति में hi = hi + there अभिव्यक्ति में फैलता है।

इस ऑपरेशन से पहले, hi और original string एक ही स्ट्रिंग ऑब्जेक्ट का संदर्भ साझा करें। विस्तृत अभिव्यक्ति में = ऑपरेशन पर, hi अब hi + there के नव निर्मित स्ट्रिंग परिणाम का संदर्भ देता है।

अभिव्यक्ति hi << there में, कुछ वस्तु hi को बदलने के लिए कुछ भी नहीं होता है। यह original_string के समान स्ट्रिंग को संदर्भित करता है, और इसलिए hi और original_string परिवर्तन को प्रतिबिंबित करता है (जो इस तथ्य के कारण है कि वे दोनों एक ही स्ट्रिंग ऑब्जेक्ट को संदर्भित करते हैं)।

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