2013-03-16 6 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

変数をコピーすることはできません。変数が参照するオブジェクトをコピーするだけです。これはペタンティックに聞こえるかもしれませんが、オブジェクトと変数の違いを理解することは混乱の原因になる可能性があります。 –

答えて

11

fooおよびbarは、同じ目的を指す。 barが別のオブジェクトを参照するようにするには、あなたがfooクローンする必要があります:以下のコードで

bar = foo.clone 
4

あなたはDUPの方法を使用することができます:これがfooのコピーを返しますので、あなたがバーに加えた変更がfooに影響を与えない

bar = foo.dup 

を。

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 

乾杯!

関連する問題