Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Сами объекты и ссылки на них (http://www.flasher.ru/forum/showthread.php?t=215563)

Appleman 18.05.2018 12:37

Сами объекты и ссылки на них
 
Друзья, поясните мне, пожалуйста, ещё один момент.

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

Код AS3:

private var _intermalArray: Array = [];
 
public function SomeClass(externalArray: Array)
{
_internalArray = externalArray;
}

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

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

Tails 18.05.2018 12:50

Да, это азы. Копируются только значения примитивных типов: Int, Uint, String, Number. Для любых объектов, коим является и массив, передаётся ссылка на объект.
Если ещё не читал Колина Мука - самое время :)

Wolsh 18.05.2018 12:55

Код AS3:

_internalArray = externalArray.concat();

Однако надо понимать, что внутри массива тоже хранятся ССЫЛКИ, и при его дублировании сами объекты – элементы массива не дублируются, то есть ты получаешь дубликат массива как упорядоченной структуры, и можешь поиграться с этой структурой, переставляя, удаляя и добавляя элементы, т.е. меняя МАССИВ.

Appleman 18.05.2018 13:06

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

caseyryan 18.05.2018 18:47

https://help.adobe.com/ru_RU/FlashPl...y.html#slice()

DEVORON 18.05.2018 20:46

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

caseyryan 18.05.2018 22:05

Цитата:

Сообщение от DEVORON (Сообщение 1205298)
Позволю себе добавить, что работа с типизированным списком Vector для широкого круга задач более рациональна.
https://help.adobe.com/ru_RU/as3/mob...c87b-7fff.html

Удивительно, что это сайт адоби. Не знаю кто там проводил тестирование вектора на этой странице, но оно сделано неверно. Тестировать нужно в релизной версии плеейра / эйра, а там, очевидно тестировалось в отладочном, который производит много всякой фигни влияющей на производительность "за кадром".
Ну это так, отступление, все равно он работает быстрее простого массива, видимо из-а отсутствия боксинга внутри.

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

DEVORON 18.05.2018 22:26

Цитата:

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

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

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

caseyryan 19.05.2018 15:35

Цитата:

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

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

Appleman 21.05.2018 10:01

Цитата:

Сообщение от caseyryan (Сообщение 1205297)

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

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


Часовой пояс GMT +4, время: 22:04.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.