如何复制一个变量而不指向同一个对象?

在 Ruby 中,我怎样才能复制一个变量,这样对原始变量的更改就不会影响复制?

例如:

phrase1 = "Hello Jim"
phrase2 = phrase1
phrase1.gsub!("Hello","Hi")
p phrase2 #outputs "Hi Jim" - I want it to remain "Hello Jim"

在这个例子中,两个变量指向同一个对象; 我想为第二个变量创建一个新对象,但是让它最初包含相同的信息。

46091 次浏览

Using your example, instead of:

phrase2 = phrase1

Try:

phrase2 = phrase1.dup

As for copying you can do:

phrase2 = phrase1.dup

or

# Clone: copies singleton methods as well
phrase2 = phrase1.clone

You can do this as well to avoid copying at all:

phrase2 = phrase1.gsub("Hello","Hi")
phrase1 = "Hello Jim"
# => "Hello Jim"


phrase2 = Marshal.load(Marshal.dump(phrase1))
# => "Hello Jim"


phrase1.gsub!("Hello","Hi")
#  => "Hi Jim"


puts phrase2
# "Hello Jim"


puts phrase1
# "Hi Jim"