2013-03-16 7 views
7

शायद मैं आज भी अपनी स्क्रीन पर बहुत लंबे समय से देख रहा हूं, लेकिन मुझे लगता है कि कुछ बुनियादी होना चाहिए मुझे छोड़ना।रूबी वैरिएबल की प्रतिलिपि कैसे करें?

मैं एक चर की 'प्रतिलिपि' बनाने की कोशिश कर रहा हूं ताकि मैं मूल को संशोधित किए बिना इसे कुशल बना सकूं।

# original var is set 
foo = ["a","b","c"] 

# i want a copy of the original var so i dont modify the original 
bar = foo 

# modify the copied var 
bar.delete("b") 

# output the values 
puts bar # outputs: ["a","c"] - this is right 
puts foo # outputs: ["a","c"] - why is this also getting modified? 

मुझे foo बदलना नहीं है।

+0

आप एक चर की प्रतिलिपि नहीं बना सकते हैं। आप जो भी कर सकते हैं वह ऑब्जेक्ट कॉपी करता है जो एक चर को संदर्भित करता है। यह pedantic लग सकता है, लेकिन एक वस्तु और एक चर के बीच अंतर को समझने से भ्रम पैदा हो सकता है। –

उत्तर

11

foo और bar एक ही ऑब्जेक्ट का संदर्भ लें। bar एक अलग वस्तु का उल्लेख करने के लिए आपको foo क्लोन करने के लिए है:

bar = foo.clone 
4

आप dup विधि का उपयोग कर सकते हैं:

bar = foo.dup 

इस foo की एक प्रति वापस आ जाएगी, इसलिए किसी भी परिवर्तन आप बार foo असर नहीं होगा।

3

नीचे कोड में आप देख सकते हैं कि foo और bar दोनों एक ही object_id कर रहे हैं। इस प्रकार foo उदाहरण में बदलना bar के माध्यम से देखने के लिए समान प्रतिबिंब का कारण बनता है।

foo = ["a","b","c"] 
#=> ["a", "b", "c"] 

foo.object_id 
#=> 16653048 

bar = foo 
#=> ["a", "b", "c"] 

bar.object_id 
#=> 16653048 

bar.delete("b") 
#=> "b" 

puts bar 
#a 
#c 
#=> nil 

puts foo 
#a 
#c 
#=> nil 

यहाँ देखें भी है कि मैं प्रभाव bar भी जमे हुए किया गया है में foo फ्रीज।

foo.freeze 
#=> ["a", "c"] 
foo.frozen? 
#=> true 
bar.frozen? 
#=> true 

इस प्रकार सही तरीके से नीचे है:

bar = foo.dup 
#=> ["a", "b", "c"] 

foo.object_id 
#=> 16450548 

bar.object_id 
#=> 16765512 

bar.delete("b") 
#=> "b" 

print bar 
#["a", "c"]=> nil 

print foo 
#["a", "b", "c"]=> nil 

चीयर्स !!

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