ruby - Change value of a cloned object -


i have object has instance variable array called my_array. declare via attr_accessor.

my_object.my_array = [1,2,3] # <= don't know max size of my_array(it can dynamic) 

i want create same object my_object , fill my_array 1 element. value inside element each value my_array's element (from my_object). because size of my_array dynamic suppose need iterate via each.

here's attempt:

my_object.my_array.each |element|          # <= my_object special object   new_object = nil unless new_object.nil?   new_object = my_object.clone # <= create new object same class my_object   new_object.my_array.clear   # <= clear element inside it.   new_object.my_array.push(element)  # assign element value first element.   # rest of code #   new_object = nil  end 

the iteration not iterating properly. size of my_object.my_array 3, should iterating 3 times, it's not, it's iterating 1 time. believe it's because of new_object.my_array.clear, cloned my_object, why happened?

the problem is, clone make shallow clone, not deep clone. in other words, my_array reference , cloned instance references same array in memory. consider:

class myclass   attr_accessor :my_array end  = myclass.new a.my_array = [1, 2, 3] a.my_array #=> [1, 2, 3]  b = a.clone b.my_array.push(4) b.my_array #=> [1, 2, 3, 4] a.my_array              # changed! #=> [1, 2, 3, 4] 

in order fix this, need extend initialize_copy method clone array:

class myclass   attr_accessor :my_array    def initialize_copy(orig)     super     self.my_array = orig.my_array.clone   end end  = myclass.new a.my_array = [1, 2, 3] a.my_array #=> [1, 2, 3]  b = a.clone b.my_array.push(4) b.my_array #=> [1, 2, 3, 4] a.my_array              # did not change, works expected #=> [1, 2, 3] 

Comments

Popular posts from this blog

php - Submit Form Data without Reloading page -

linux - Rails running on virtual machine in Windows -

php - $params->set Array between square bracket -