2016-12-25 1 views
2

Итак, я изучал кристалл без рубинового фона и заметил, что api docs имеют #dup и #clone для копирования в основном массива.В чем разница между #clone и #dup

В чем же разница между этими двумя? Апи говорит, что #dup неглубоко копирует массив, пока #clone глубоких копий указанного массива. Я не уверен, что именно это влечет за собой и какой из них я должен использовать.

ответ

4

#dup будет дублировать массив в памяти, то есть список элементов, которые он содержит, но он не будет дублировать сами элементы. Мутирование нового массива не повлияет на предыдущий массив (например, push, pop), но мутация любого из его элементов повлияет на элемент предыдущего массива, поскольку элементы являются одинаковыми объектами.

#clone будет дублировать список массивов в памяти, но также и его элементы, путем рекурсивного вызова #clone. Это полный клон исходного массива. Мутирование любого, даже глубокого вложенного объекта, не повлияет на исходный контент.

Обратите внимание, что это относится к любому объекту, а не только к массивам, и что поведение может быть изменено путем переопределения методов в ваших собственных объектах.

Это, как говорится, применяется только для массивов объектов (например, экземпляров класса). Для массивов примитивов (integer, float, struct ...) элементы будут скопированы вместе со списком массивов на #dup.