Как уже отмечали другие люди, вы можете использовать клон. Однако это не будет работать, так как это мелкая копия, поэтому подмассивы (я думаю, это не многомерный массив) не будут клонированы. Поскольку массивы в Ruby являются изменяемыми объектами, вложенные массивы будут изменены. Например, проверьте это
>> blah = [[3,5],6]
=> [[3, 5], 6]
>> joe = blah.clone
=> [[3, 5], 6]
>> joe[0]
=> [3, 5]
>> joe[0].push "blah"
=> [3, 5, "blah"]
>> blah
=> [[3, 5, "blah"], 6]
Так что, как видите, простое выполнение клонирования не сработает. Но ты это знал, отсюда и твой вопрос.
Я приготовил это только сейчас. Так будет до тех пор, пока вы не найдете настоящий Ruby способ сделать это (я просто работаю в Ruby, я не эксперт).
def dup_recursive(new_array, old_array)
old_array.each do |item|
if item.class == Array
new_array << dup_recursive([], item)
else
new_item = item.dup rescue new_item = item # in case it's got no dupe, like FixedNum
new_array << new_item
end
new_array
end
end
array=[[3,[9,12]],[5,9],[10,2],[11,3]]
new_array = Array.new
dup_recursive(new_array, array)
puts array.inspect
puts new_array.inspect
Я знаю, я не пользуюсь набором текста, но я был бы рад узнать, как это сделать, не спрашивая класс рассматриваемого объекта.
Редактировать: Я должен был просто поискать в рубине глубокого клона в Google, но иногда мне нравится писать код:) ... в любом случае, другое представленное решение - Marshal.load( Marshal.dump( array ) )
- также работайте для хэшей и так далее, так что лучше.