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 回答