|
|
|||||
Цитата:
Цитата:
Опередил)
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Я щас подумал — может, твоя заковыка в том, что ты не очень ясно понимаешь, что такое переменная и что такое сам объект? Ты думал, что в Dictionary добавляется переменная?
Смотри. Про простые типы (строки и числа) тут уже говорили, да. А все остальное "передается по ссылке". Переменная вообще не является объектом. Это именная ячейка памяти. По сути, у нее 6 составляющих: 1. Тип доступа (static private и т.п.) 2. Константность — переменная это или константа 3. Имя (_arr) 4. Тип данных (:Array) 5. Значение - ссылка (адрес данных объекта в памяти) 6. Контекст (свойство класса/экземпляра или локальная переменная функции) Каждая переменная занимает одно и тоже количество байт, независимо от того, каков размер объекта в памяти. Потому что ее значение это просто число, адрес ячейки памяти, в которую записан объект. Объект может быть создан без сохранения ссылки на него вообще, то есть можно же просто написать И хотя new возвращает ссылку на только что созданный объект, эта ссылка никуда не сохраняется. Объект существует (пока его не заберет коллектор) в памяти, но никто не знает, где. Однако, если ты сохранишь ссылку в ячейке массива (вектора, справочника, хэш-объекта), то он уже не безродный безымянный, на него есть ссылка. Потому что _arr[5] это такая же точно переменная экземпляра _arr с int-именем 5 (в справочнике сложнее, там "именем" или ключом будет ссылка на другой объект). Разница лишь в том, что в массиве и справочнике все "переменные" имеют тип Object, и поэтому могут хранить что угодно (в отличие от типизированного Вектора и тем более явно заданной через var/const переменной строгого типа), и создаются динамически "на лету". В остальном это то же самое, как если бы в классе Array было объявлено свойство экземпляра public var 5:Object = undefined; в которое ты и записываешь ссылку на новый объект. Поэтому и нет никакого смысла создавать промежуточную переменную для сохранения ссылки, возвращаемой new. Эта ссылка прекрасно сохранится в свойстве 5 экземпляра Array. Добавлено через 25 минут Можно еще с такого ракурса рассмотреть: Хотя переменные хранят ссылки, сами они объектами не являются, и на них самих ссылок нет. Это значит, что нельзя сохранить в переменной другую переменную (то есть ссылку на другую переменную), нельзя передать функции переменную. Передается значение-ссылка, хранящаяся в переменной. То есть: потому что b не обращается к а, когда ее запрашивают, b ничего не знает ни о какой а, b получила ссылку на спрайт и хранит ее теперь независимо от а.
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Цитата:
сразу записать: Вот собственно в этом и был вопрос, ибо у меня не получался правильный синтаксис. Мне его любезно подсказал Tails. В любом случае спасибо за обстоятельный ликбез. Никогда не лишне Добавлено через 1 минуту Да, меня заинтересовала возможность преобразования массива в вектор.
__________________
Не сломано - не чини! |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
А "поместить создаваемый вектор" у тебя прекрасно получалось. --- Может показаться, что я придираюсь к словам. Но для программиста важна точность формулировки. Иначе реально непонятно, где именно скрывается проблема. Твоя формулировка неверна: вектор прекрасно записывался в Справочник. Просто в нем не было нужных тебе строк, потому что сам вектор инициируется неверно. К Справочнику это не имеет ровным счетом никакого отношения. Справка по вектору здесь. Вкратце: public function Vector(length:uint = 0, fixed:Boolean = false) Здесь мы видим, какие параметры принимает конструктор Вектора: длину создаваемого вектора и флаг фиксированности длины. Никаких элементов для заполнения ячеек конструктор не принимает, поэтому запись new Vector.<String> ("test") не имеет того смысла, который ты в нее вкладывал. Строку "test" конструктор пытался преобразовывать в число — длину вектора, но получалоcь int("test") = 0; Если бы ты передавал строку, из которой можно получить число, был бы вектор соответствующей длины: Ну а запись new Vector.<String> ["test"]; у тебя просто не принял компилятор, поскольку такого синтаксиса не существует.
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 25.05.2018 в 23:20. |
|
|||||
Салоцировать массив(который потом заберет GC), отдать в глобальную функцию, чтобы получить вектор, чОтенько
__________________
местонахождение |
|
|||||
Я кстати, только что столкнулся с проблемой, программируя под древний 10й плеер на базе flex_sdk_3.6a, что запись
он не понимает критически и ругается на ошибку синтаксиса А вот запись, которую предложил Wolsh, хавает на ура! Вывод: хорошо, что я читаю этот форум и помню, что недавно была такая тема)))
__________________
while(live()) { hope(); } |
|
|||||
Я вас умоляю, это же клиент, там ресурсы безграничны. )
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: Apr 2018
Сообщений: 42
|
Цитата:
Последний раз редактировалось RedHead90; 13.06.2018 в 20:46. |
|
|||||
Регистрация: May 2016
Сообщений: 25
|
Цитата:
function init():void { var s:Sprite = new Sprite(); s.addEventListener(Event.ENTER_FRAME, this.onEF); var v:Vector.<Sprite> = new Vector.<Sprite>([new Sprite(), s]); } function onEF(e:Event):void { trace("EF"); this._i++; if (this._i > 5) System.gc(); } //output: //EF //EF //EF //EF //EF //EF |
|
|||||
Регистрация: Apr 2018
Сообщений: 42
|
robotR2D2, если честно, то что-то я не вкуриваю, как этот код отвечает на мой вопрос?
|
Часовой пояс GMT +4, время: 18:23. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|