PDA

Просмотр полной версии : Сами объекты и ссылки на них


Appleman
18.05.2018, 12:37
Друзья, поясните мне, пожалуйста, ещё один момент.

Столкнулся с такой ситуацией. Создаю в неком классе массив, наполняю какими-то элементами. Передаю в конструктор другого класса, которому поручено переписать все элементы полученного массива "к себе" и как-то с ними поработать, но (самое главное!) оставить в целости оригинальный массив, полученный из вне. Но вот такая запись:

private var _intermalArray: Array = [];

public function SomeClass(externalArray: Array)
{
_internalArray = externalArray;
}

как выяснилось, ни фига не делает дубликат массива, а лишь передаёт ссылку. И все изменения отражаются также и в исходном. Так и должно быть? И вообще всегда ли при передаче переменных, содержащих некий объект, передаётся только ссылка на сам объект? Как-то я не чувствую логики.

P.S. Задачу пока что решил через цикл, который последовательно перебирает элементы полученного массива и записывает по одному во внутренний. В таком случае они действительно разными получаются.

Tails
18.05.2018, 12:50
Да, это азы. Копируются только значения примитивных типов: Int, Uint, String, Number. Для любых объектов, коим является и массив, передаётся ссылка на объект.
Если ещё не читал Колина Мука (https://www.ozon.ru/context/detail/id/4121608/) - самое время :)

Wolsh
18.05.2018, 12:55
_internalArray = externalArray.concat();Однако надо понимать, что внутри массива тоже хранятся ССЫЛКИ, и при его дублировании сами объекты – элементы массива не дублируются, то есть ты получаешь дубликат массива как упорядоченной структуры, и можешь поиграться с этой структурой, переставляя, удаляя и добавляя элементы, т.е. меняя МАССИВ.

Appleman
18.05.2018, 13:06
Tails, Wolsh, спасибо, исчерпывающе. Наверное я из-за примитивных типов и запутался, т.к. в основном применительно к ним подобное происходит: получили, скопировали, поработали с результатом.

caseyryan
18.05.2018, 18:47
https://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/Array.html#slice()

DEVORON
18.05.2018, 20:46
Позволю себе добавить, что работа с типизированным списком Vector для широкого круга задач более рациональна.
https://help.adobe.com/ru_RU/as3/mobile/WS4bebcd66a74275c3a0f5f19124318fc87b-7fff.html

caseyryan
18.05.2018, 22:05
Позволю себе добавить, что работа с типизированным списком Vector для широкого круга задач более рациональна.
https://help.adobe.com/ru_RU/as3/mobile/WS4bebcd66a74275c3a0f5f19124318fc87b-7fff.html
Удивительно, что это сайт адоби. Не знаю кто там проводил тестирование вектора на этой странице, но оно сделано неверно. Тестировать нужно в релизной версии плеейра / эйра, а там, очевидно тестировалось в отладочном, который производит много всякой фигни влияющей на производительность "за кадром".
Ну это так, отступление, все равно он работает быстрее простого массива, видимо из-а отсутствия боксинга внутри.

А я хотел здесь сказать, что для широкого круга задач, как раз рациональнее исползовать Array, потому, что с ним в коде работать проще. А Vector лучше использовать для узкого круга, где объектов нужно обрабатывать очень много и скорость играет важную роль

DEVORON
18.05.2018, 22:26
А я хотел здесь сказать, что для широкого круга задач, как раз рациональнее исползовать Array, потому, что с ним в коде работать проще. А Vector лучше использовать для узкого круга, где объектов нужно обрабатывать очень много и скорость играет важную роль

Смотря какой процент занимают типизированные элементы в проекте. Классы, наследованные от общего родителя, классы реализующие общий интерфейс

Если для Array преимущество в гибкости(принимает любые типы), то для Vector в наглядности(известно, с каким типом работаем)

caseyryan
19.05.2018, 15:35
Смотря какой процент занимают типизированные элементы в проекте. Классы, наследованные от общего родителя, классы реализующие общий интерфейс

Если для Array преимущество в гибкости(принимает любые типы), то для Vector в наглядности(известно, с каким типом работаем)
Вот это я бы и назвал узким кругом задач

Appleman
21.05.2018, 10:01
https://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/Array.html#slice()

Спасибо, caseyryan. Даже обидно, смотрел-смотрел и просмотрел, что такое решение штатно есть.

И да, на практике у меня уже несколько раз получалось сначала забацать Array, а потом по мере упорядочивания процесса переводить его в Vector.