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

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

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 483
Цитата:
Сообщение от Wolsh Посмотреть сообщение
я так и не привык визуально к этой записи и делаю по старинке
Код AS3:
var v:Vector.<String> = Vector.<String>(["test", "test1"]);
Я тоже обычно так и записываю, но мой изначальный вопрос был в том, как сразу запихать создаваемый вектор в Dictionary, минуя его запись в переменную. В этом суть.

Цитата:
Сообщение от Wolsh Посмотреть сообщение
Мне удобно так — больше однообразия, да и массив реально мог быть создан ранее и в другом месте.
Можно подробнее про "создан в другом месте"? Не понял.
__________________
Не сломано - не чини!

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
В этом суть.
Абсолютно непонятно, в чем. Нет вообще никакой особенности, никакого отличия и никакого нюанса из-за того, что это Вектор.
Точно так же, как при добавлении чего-то в массив тебе не нужно создавать никаких переменных.
Код AS3:
_arr[5] = new Sprite();
Цитата:
Не понял.
Код AS3:
var arr:Array = ["test", "test1"];
var v:Vector.<String> = Vector.<String>(arr);
__________________
Reality.getBounds(this);

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

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

Старый 25.05.2018, 12:22
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
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
  № 5  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 483
Цитата:
Сообщение от 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
  № 6  
Ответить с цитированием
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.
Старый 12.06.2018, 10:17
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 7  
Ответить с цитированием
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(); }

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

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


Последний раз редактировалось RedHead90; 13.06.2018 в 20:46.
Старый 14.06.2018, 02:30
robotR2D2 вне форума Посмотреть профиль Отправить личное сообщение для robotR2D2 Найти все сообщения от robotR2D2
  № 9  
Ответить с цитированием
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
  № 10  
Ответить с цитированием
RedHead90

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

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

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

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


 


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


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