Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.05.2018, 11:42
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 11  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
XMLоподобная запись в треугольных скобках меня спотыкает.
А я когда начал заниматься другими языками, в которых есть дженерики, привык к записи с угловымы скобками, и сейчас они мне кажутся удобными и даже красивыми
Цитата:
Можно подробнее про "создан в другом месте"? Не понял.
Ну, он имел в виду, что массив уже мог существовать для чего-то другого раньше, а потом ты его просто перегнал в вектор
Опередил)
__________________
Ко мне можно и нужно обращаться на ты)

Старый 25.05.2018, 12:22
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 12  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Я щас подумал — может, твоя заковыка в том, что ты не очень ясно понимаешь, что такое переменная и что такое сам объект? Ты думал, что в Dictionary добавляется переменная?
Смотри. Про простые типы (строки и числа) тут уже говорили, да. А все остальное "передается по ссылке".
Переменная вообще не является объектом. Это именная ячейка памяти. По сути, у нее 6 составляющих:
1. Тип доступа (static private и т.п.)
2. Константность — переменная это или константа
3. Имя (_arr)
4. Тип данных (:Array)
5. Значение - ссылка (адрес данных объекта в памяти)
6. Контекст (свойство класса/экземпляра или локальная переменная функции)
Каждая переменная занимает одно и тоже количество байт, независимо от того, каков размер объекта в памяти.
Потому что ее значение это просто число, адрес ячейки памяти, в которую записан объект.
Объект может быть создан без сохранения ссылки на него вообще, то есть можно же просто написать
Код AS3:
new Box();
И хотя new возвращает ссылку на только что созданный объект, эта ссылка никуда не сохраняется. Объект существует (пока его не заберет коллектор) в памяти, но никто не знает, где. Однако, если ты сохранишь ссылку в ячейке массива (вектора, справочника, хэш-объекта), то он уже не безродный безымянный, на него есть ссылка. Потому что _arr[5] это такая же точно переменная экземпляра _arr с int-именем 5 (в справочнике сложнее, там "именем" или ключом будет ссылка на другой объект). Разница лишь в том, что в массиве и справочнике все "переменные" имеют тип Object, и поэтому могут хранить что угодно (в отличие от типизированного Вектора и тем более явно заданной через var/const переменной строгого типа), и создаются динамически "на лету". В остальном это то же самое, как если бы в классе Array было объявлено свойство экземпляра public var 5:Object = undefined; в которое ты и записываешь ссылку на новый объект.
Поэтому и нет никакого смысла создавать промежуточную переменную для сохранения ссылки, возвращаемой new. Эта ссылка прекрасно сохранится в свойстве 5 экземпляра Array.

Добавлено через 25 минут
Можно еще с такого ракурса рассмотреть:
Хотя переменные хранят ссылки, сами они объектами не являются, и на них самих ссылок нет.
Это значит, что нельзя сохранить в переменной другую переменную (то есть ссылку на другую переменную), нельзя передать функции переменную. Передается значение-ссылка, хранящаяся в переменной. То есть:
Код AS3:
var a:Sprite = new Sprite();
var b:Sprite = a;
a = null;
trace(b); // [object Sprite]
потому что b не обращается к а, когда ее запрашивают, b ничего не знает ни о какой а, b получила ссылку на спрайт и хранит ее теперь независимо от а.
__________________
Reality.getBounds(this);

Старый 25.05.2018, 15:05
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 13  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Я щас подумал — может, твоя заковыка в том, что ты не очень ясно понимаешь, что такое переменная и что такое сам объект? Ты думал, что в Dictionary добавляется переменная?
Да нет же. Слава богу, про объекты и хранящие их переменные я разобрался некоторое время тому назад. Загвоздка была именно в том, чтобы в Dictionary СРАЗУ поместить создаваемый вектор, как раз минуя стадию записи его в переменную. То есть вместо:
Код AS3:
var v: Vector.<String> = new Vector.<String> ["test", "test"];
dictionary["id"] = v;
сразу записать:
Код AS3:
dictionary["id"] = новый вектор, содержащий ["test", "test"]
Вот собственно в этом и был вопрос, ибо у меня не получался правильный синтаксис. Мне его любезно подсказал Tails.

В любом случае спасибо за обстоятельный ликбез. Никогда не лишне

Добавлено через 1 минуту
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Ну, он имел в виду, что массив уже мог существовать для чего-то другого раньше, а потом ты его просто перегнал в вектор
Опередил)
Да, меня заинтересовала возможность преобразования массива в вектор.
__________________
Не сломано - не чини!

Старый 25.05.2018, 22:00
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 14  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Загвоздка была именно в том, чтобы в Dictionary СРАЗУ поместить создаваемый вектор, как раз минуя стадию записи его в переменную.
Нет же. Загвоздка была в том, что ты не создавал НУЖНЫЙ ТЕБЕ вектор.
А "поместить создаваемый вектор" у тебя прекрасно получалось.
---
Может показаться, что я придираюсь к словам. Но для программиста важна точность формулировки. Иначе реально непонятно, где именно скрывается проблема. Твоя формулировка неверна: вектор прекрасно записывался в Справочник. Просто в нем не было нужных тебе строк, потому что сам вектор инициируется неверно. К Справочнику это не имеет ровным счетом никакого отношения.

Справка по вектору здесь.
Вкратце:
public function Vector(length:uint = 0, fixed:Boolean = false)
Здесь мы видим, какие параметры принимает конструктор Вектора: длину создаваемого вектора и флаг фиксированности длины.
Никаких элементов для заполнения ячеек конструктор не принимает, поэтому запись new Vector.<String> ("test") не имеет того смысла, который ты в нее вкладывал.
Строку "test" конструктор пытался преобразовывать в число — длину вектора, но получалоcь int("test") = 0;
Если бы ты передавал строку, из которой можно получить число, был бы вектор соответствующей длины:
Код AS3:
			trace("int:", int("0xffffff")); // выводит: int: 16777215
			var v:Vector.<String> = new Vector.<String> ("0xffffff");
			trace(v.length); // выводит: 16777215
Ну а запись new Vector.<String> ["test"]; у тебя просто не принял компилятор, поскольку такого синтаксиса не существует.
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 25.05.2018 в 23:20.
Старый 27.05.2018, 21:17
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 15  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Цитата:
Сообщение от Wolsh Посмотреть сообщение
я так и не привык визуально к этой записи и делаю по старинке
Код AS3:
var v:Vector.<String> = Vector.<String>(["test", "test1"]);
Салоцировать массив(который потом заберет GC), отдать в глобальную функцию, чтобы получить вектор, чОтенько
__________________
местонахождение

Старый 12.06.2018, 10:17
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 16  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Я кстати, только что столкнулся с проблемой, программируя под древний 10й плеер на базе flex_sdk_3.6a, что запись
Код AS3:
var textVector:Vector.<String> = new <String>["asd", "asdasd"];
он не понимает критически и ругается на ошибку синтаксиса
Код:
Error:(17, 75) [loadingSide]: Error code: 1084: Syntax error: expecting rightbrace before semicolon.
А вот запись, которую предложил Wolsh, хавает на ура! Вывод: хорошо, что я читаю этот форум и помню, что недавно была такая тема)))
__________________
while(live()) { hope(); }

Старый 12.06.2018, 10:58
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 17  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Цитата:
Сообщение от СлаваRa Посмотреть сообщение
Салоцировать массив(который потом заберет GC), отдать в глобальную функцию, чтобы получить вектор, чОтенько
Я вас умоляю, это же клиент, там ресурсы безграничны. )
__________________
Дети не должны знать о своих родителях

Старый 13.06.2018, 20:14
RedHead90 вне форума Посмотреть профиль Отправить личное сообщение для RedHead90 Найти все сообщения от RedHead90
  № 18  
Ответить с цитированием
RedHead90

Регистрация: Apr 2018
Сообщений: 42
Цитата:
Салоцировать массив(который потом заберет GC), отдать в глобальную функцию, чтобы получить вектор, чОтенько
Кстати, получается, что массив, который мы создаем только для инициализации вектора, не выходит из стека. А будет ли он тогда висеть в памяти, дожидаясь сборщика или освободится сразу по выходу из стека?


Последний раз редактировалось RedHead90; 13.06.2018 в 20:46.
Старый 14.06.2018, 02:30
robotR2D2 вне форума Посмотреть профиль Отправить личное сообщение для robotR2D2 Найти все сообщения от robotR2D2
  № 19  
Ответить с цитированием
robotR2D2

Регистрация: May 2016
Сообщений: 25
Цитата:
Сообщение от RedHead90 Посмотреть сообщение
А будет ли он тогда висеть в памяти, дожидаясь сборщика или освободится сразу по выходу из стека?
Код AS3:
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

Старый 14.06.2018, 02:47
RedHead90 вне форума Посмотреть профиль Отправить личное сообщение для RedHead90 Найти все сообщения от RedHead90
  № 20  
Ответить с цитированием
RedHead90

Регистрация: Apr 2018
Сообщений: 42
robotR2D2, если честно, то что-то я не вкуриваю, как этот код отвечает на мой вопрос?

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:23.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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