Ruby: Wie kann ich eine Variable kopieren, ohne auf dasselbe Objekt zu zeigen?

73

Wie kann ich in Ruby eine Variable so kopieren, dass Änderungen am Original keine Auswirkungen auf die Kopie haben?

Zum Beispiel:

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

In diesem Beispiel zeigen die beiden Variablen auf dasselbe Objekt. Ich möchte ein neues Objekt für die zweite Variable erstellen, aber es enthält anfangs dieselben Informationen.

Nathan Long
quelle

Antworten:

106

Zum Kopieren haben Sie folgende Möglichkeiten:

phrase2 = phrase1.dup

oder

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

Sie können dies auch tun, um das Kopieren zu vermeiden:

phrase2 = phrase1.gsub("Hello","Hi")
khelll
quelle
20

Verwenden Sie Ihr Beispiel anstelle von:

phrase2 = phrase1

Versuchen:

phrase2 = phrase1.dup
Jacob Winn
quelle
Ihre Antwort funktioniert für die Frage, die ich gestellt habe, die ziemlich allgemein war. Es scheint jedoch nicht für das Problem zu funktionieren, das ich wirklich zu lösen versuche . Stackoverflow.com/questions/1465696/… . Irgendwelche Ideen?
Nathan Long
Danke übrigens für deine Hilfe. :)
Nathan Long
3
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"
Rafeeq
quelle
7
Erklären Sie bei der Beantwortung, warum Ihre Lösung hilfreich ist. Das bildet die fragende Person aus, damit sie das Problem in Zukunft verstehen und vermeiden kann.
der Blechmann