Что значит для .slice () быть "мелким клоном"? - PullRequest
1 голос
/ 23 февраля 2011

Классы ActionScript Array и Vector оба имеют метод slice ().Если вы не передадите никаких параметров, новый массив или вектор будет дубликатом (мелким клоном) исходного вектора.

Что значит быть «мелким клоном»?В частности, в чем разница между

Array newArray = oldArray.slice();
Vector.<Foo> newVector = oldVector.slice();

и

Array newArray = oldArray;
Vector.<Foo> newVector = oldVector;

?Кроме того, что, если базовый тип вектора не Foo, а что-то простое и неизменное, например, int?

Обновление:

Каков результат следующего?

var one:Vector.<String> = new Vector.<String>()

one.push("something");
one.push("something else");

var two:Vector.<String> = one.slice();

one.push("and another thing");

two.push("and the last thing");

trace(one); // something, something else, and another thing
trace(two); // something, something else, and the last thing

Спасибо!♥

1 Ответ

1 голос
/ 23 февраля 2011

В вашем контексте .slice() просто делает копию вашего вектора, так что newArray относится к другому объекту из oldArray, за исключением того, что оба выглядят как идентичные объекты. Точно так же идет для newVector и oldVector.

Второй фрагмент:

Array newArray = oldArray;
Vector.<Foo> newVector = oldVector;

фактически делает newArray ссылкой на oldArray. Это означает, что обе переменные ссылаются на один и тот же массив. То же самое для newVector и oldVector - оба в конечном итоге ссылаются на один и тот же вектор. Думайте об этом, как об использовании резинового штампа для двухкратной печати одной и той же печати на разных листах бумаги: это одна и та же печать, только что изображенная на двух листах бумаги.

С другой стороны, термин мелкая копия отличается от глубокой копии тем, что мелкой является копия только объекта , тогда как глубокой является копия объект и все его свойства .

Кроме того, что, если базовый тип вектора не Foo, а что-то простое и неизменное, например, int?

То же самое, потому что ваши переменные ссылаются на объекты Vector, а не на их int s.

Каков результат следующего?

Ваш вывод правильный:

something, something else, and another thing
something, something else, and the last thing

two = one.slice() без каких-либо аргументов создает новую копию one со всем ее текущим содержимым и присваивает ее two. Когда вы нажимаете каждый третий элемент на one и two, вы добавляете к отдельным Vector объектам.

...