У меня есть класс, одним из членов которого является массив. Мне нужно довольно много копировать объекты этого класса. Я обнаружил, что если я копирую объект, даже используя clone
, члены массива по-прежнему ссылаются на тот же массив:
class MyClass
def initialize(a, b, items)
@a = a
@b = b
@items = items
end
attr_accessor :a, :b, :items
end
=> nil
2.1.5 :009 > test = MyClass.new(2, 3, [1, 2, 3])
=> #<MyClass:0x0000000231e7f8 @a=2, @b=3, @items=[1, 2, 3]>
2.1.5 :010 > newtest = test.clone
=> #<MyClass:0x00000002312368 @a=2, @b=3, @items=[1, 2, 3]>
2.1.5 :011 > newtest.a = 55
=> 55
2.1.5 :012 > newtest
=> #<MyClass:0x00000002312368 @a=55, @b=3, @items=[1, 2, 3]>
2.1.5 :013 > test
=> #<MyClass:0x0000000231e7f8 @a=2, @b=3, @items=[1, 2, 3]>
2.1.5 :014 > newtest.items[1] = nil
=> nil
2.1.5 :015 > newtest
=> #<MyClass:0x00000002312368 @a=55, @b=3, @items=[1, nil, 3]>
2.1.5 :016 > test
=> #<MyClass:0x0000000231e7f8 @a=2, @b=3, @items=[1, nil, 3]>
Как я могу скопировать массив вместе с объектом?
2 ответа
Для этого вы можете использовать базовый класс Marshal
, измени свою линию
newtest = test.clone
К
newtest = Marshal.load(Marshal.dump(test))
У нас есть собственная реализация для выполнения глубоких клонов рубиновых объектов: ruby_deep_clone
Установите его с помощью gem:
gem install ruby_deep_clone
Пример использования:
require "deep_clone"
object = SomeComplexClass.new()
cloned_object = DeepClone.clone(object)
Похожие вопросы
Новые вопросы
ruby
Ruby - это многоплатформенный динамический объектно-ориентированный интерпретируемый язык с открытым исходным кодом. Тег [ruby] предназначен для вопросов, связанных с языком Ruby, включая его синтаксис и его библиотеки. Вопросы Ruby on Rails должны быть помечены [ruby-on-rails].