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
Post a Comment