Bug #14355
closedclone issue
Description
#!/usr/bin/env ruby
aMutantSpeak = [[nil,nil],[nil,nil]]
aDogSpeak = aMutantSpeak.clone
aCatSpeak = aMutantSpeak.clone
aDogSpeak[0][0] = "W"
aCatSpeak[0][0] = "m"
aCatSpeak[0][1] = "e"
aDogSpeak[0][1] = "O"
aCatSpeak[1][0] = "o"
aDogSpeak[1][0] = "O"
aDogSpeak[1][1] = "F"
aCatSpeak[1][1] = "w"
print "aMutantSpeak ", aMutantSpeak
puts
print "aDogSpeak ", aDogSpeak
puts
print "aCatSpeak ", aCatSpeak
#all three arrays are now [["m","O"],["O","w"]]
This is what I wanted:¶
aMutantSpeak = [[nil,nil],[nil,nil]]¶
aDogSpeak = [["W","O"],["O","F"]]¶
aCatSpeak = [["m","e"],["o","w"]]¶
I think this is what clone should do.¶
Files
Updated by jeremyevans0 (Jeremy Evans) about 6 years ago
- Status changed from Open to Rejected
- ruby -v deleted (
1.9.3 & 2.2.2)
As documented, Object#clone
and Object#dup
do shallow copies by default, so this behavior is expected. Create your own class and override initialize_copy
(or initialize_dup
and initialize_clone
) as appropriate for the behavior you want.
One quick alternative for making a deep copy is using Marshal.load(Marshal.dump(obj))
, but note that not all objects can be marshalled.