Как уже отмечали другие, clone
сделает это.Имейте в виду, что clone
хеша делает мелкую копию.То есть:
h1 = {:a => 'foo'}
h2 = h1.clone
h1[:a] << 'bar'
p h2 # => {:a=>"foobar"}
Происходит то, что копируются ссылки на хэш, а не объекты, на которые ссылаются ссылки.
Если вам нужна глубокая копия, тогда:
def deep_copy(o)
Marshal.load(Marshal.dump(o))
end
h1 = {:a => 'foo'}
h2 = deep_copy(h1)
h1[:a] << 'bar'
p h2 # => {:a=>"foo"}
deep_copy
работает для любого объекта, который можно маршалировать.Большинство встроенных типов данных (Array, Hash, String и т. Д.) Можно упорядочить.
Marshalling - это имя Руби для сериализация .При маршаллинге объект - вместе с объектами, на которые он ссылается - преобразуется в серию байтов;эти байты затем используются для создания другого объекта, такого как оригинал.