2012-09-19 3 views
7

बदलता है मेरे पास मानों की एक सरणी है जिसे मैं हैश मानों को प्रिंट करते समय ऑर्डर के संदर्भ के रूप में उपयोग करता हूं। मैं सरणी को संशोधित करना चाहता हूं ताकि सरणी मान "सुंदर" हो। मैंने सोचा कि मैं सिर्फ सरणी को डुप्लिकेट या क्लोन कर दूंगा, मानों को बदल दूंगा और मूल वस्तु अनचाहे रहेगी। हालांकि (आईआरबी में) ...दोनों डुप्लिकेट और क्लोन अलग-अलग ऑब्जेक्ट्स लौटाते हैं, लेकिन उन्हें संशोधित करने से मूल ऑब्जेक्ट

@arr = ['stuff', 'things'] 
a = @arr.clone 
b = @arr.dup 

तो, कम से कम, एक और @arr विभिन्न वस्तुओं रहे हैं:

a.object_id == @arr.object_id 
=> false 

लेकिन अब यह अजीब

a[0].capitalize! 
a 
=> ['Stuff', 'things'] 
@arr 
=> ['Stuff', 'things'] ##<-what? 
b 
=> ['Stuff', 'things']## <-what??? 

ठीक हो जाता है ... तो एक को संशोधित करना दूसरों को बदलता है, इसे वापस बदल देता है?

a[0] = 'stuff' 
a 
=> ['stuff', 'things'] 
@arr 
=> ['Stuff', 'things'] ## <- WHAT????? 

पूर्णता बी [1] के लिए .capitalize! एक ही प्रभाव है, सभी तीन सरणी की दूसरी स्थिति

तो ... क्या पूंजीकरण के अंत में बैंग इसे अतिरिक्त शक्तिशाली बनाता है? अन्य वस्तुओं पर पार करने के लिए पर्याप्त ?? मुझे ऐसा करने के अन्य तरीकों के बारे में पता है, लेकिन यह मेरे लिए बेहद अजीब लग रहा था। मुझे लगता है कि यह "उथली प्रतिलिपि" होने के साथ कुछ करने के लिए है। ऐसा करने के सर्वोत्तम तरीके पर सुझाव?

उत्तर

8

dup और clone सरणी के नए उदाहरण बनाते हैं, लेकिन सामग्री की नहीं, यह कोई गहरी प्रति नहीं है।

देखें:

array0 = ['stuff', 'things'] 
array1 = array0.clone 
array2 = array0.dup 

puts "Array-Ids" 
p array0.object_id 
p array1.object_id 
p array2.object_id 

puts "Object ids" 
array0.each_with_index{|_,i| 
    p array0[i].object_id 
    p array1[i].object_id 
    p array2[i].object_id 
    p '--------' 
} 

सरणी शेयर अंदर तत्व एक ही object_id - वे एक ही वस्तु है। सरणी में अलग ऑब्जेक्ट आईडी होते हैं।

जब आप a[0].capitalize! आप किसी ऑब्जेक्ट को संशोधित करते हैं, जो तीन अलग-अलग सरणी में भाग लेता है।

भी

+0

आह देखें ... मैं देख रहा हूँ। मैं यह भी देखता हूं कि मुझे जो चाहिए वह जानना एक "गहरी प्रति" थी, मेरी खोज में काफी मदद मिली होगी :- धन्यवाद! – jearl

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