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) almost 8 years ago
          Updated by jeremyevans0 (Jeremy Evans) almost 8 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.