8

今日は画面を長時間見つめすぎたのかもしれませんが、非常に基本的なことだと思うことが、私を困惑させています。

元の変数を変更せずに操作できるように、変数の「コピー」を作成しようとしています。

# 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変わらないで ほしい。

4

3 に答える 3

13

foobar同じオブジェクトを参照します。別のオブジェクトをbar参照するには、クローンを作成する必要がありますfoo

bar = foo.clone
于 2013-03-16T02:56:24.310 に答える
5

dup メソッドを使用できます。

bar = foo.dup

これは foo のコピーを返すので、bar を変更しても foo には影響しません。

于 2013-03-16T02:55:08.133 に答える
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

ここでも凍結されていることを参照してfooくださいbar

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

乾杯!!

于 2013-03-16T12:09:47.037 に答える