2013-03-16 57 views
7

也許我今天剛剛盯着我的屏幕太久了,但是我認爲應該是非常基本的東西就是讓我陷入困境。如何複製ruby變量?

我想讓一個變量的'複製',所以我可以操縱它而不修改原來的。

# 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

您無法複製變量。你所能做的就是複製一個變量引用的對象。這可能聽起來很迂腐,但不理解對象和變量之間的差異會導致混淆。 – 2013-03-17 22:29:45

回答

11

foobar指的是同一個對象。爲了使bar是指不同的對象,你要克隆foo

bar = foo.clone 
4

您可以使用DUP方法:

bar = foo.dup 

這將返回FOO的副本,讓你做任何改動吧不會影響富。

3

在下面的代碼,你可以看到,foobar兩者都具有相同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 

乾杯!!