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

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

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

блогер
Регистрация: Nov 2007
Адрес: Киев
Сообщений: 557
Записей в блоге: 2
А чем для проверки это вот не устраивает?:
Код AS3:
var v:Vector.<Sprite> = new Vector.<Sprite>();
trace(v is Vector.<*>);//true
Кстати, интересно, что Vector.<*>(v), в отличие от Vector.<Object>(v) не создает нового вектора. Т.е. это типа декларативная запись.
Код AS3:
trace(v === Vector.<*>(v));//true
А еще:
Код AS3:
v.push(new Sprite());
v.push(new Sprite());
trace(Vector.<String>(v));// [object Sprite], [object Sprite]
trace(Vector.<int>(v));// 0,0
trace(v is Vector.<DisplayObject>);// false

Старый 27.11.2011, 00:48
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 22  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
@i.o., рабочий, только это не вектора же
а как будет с
Код:
int[] intArr = new int[] { 0, 1, 2 };
string[] strArr = new string[] { "a", "b" };
т.е. вот что есть у нас во флеше, а ничего другого нет пока

Старый 27.11.2011, 00:51
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 23  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
это массивы вообще
С ними, конечно же, никак.

Добавлено через 12 минут
Прошу прощения, поспешил:
Код AS1/AS2:
        public Form1()
        {
            InitializeComponent();
 
            int[] intArray = new int[] { 0, 1, 2, 3, 4 };
            string[] stringArray = new string[] { "a", "b", "c", "d" };
 
            Debug.WriteLine("intArray length: " + this.GetArrayLength(intArray));
            Debug.WriteLine("stringArray length: " + this.GetArrayLength(stringArray));
        }
 
        public int GetArrayLength<T>(T[] array)
        {
            return array.Length;
        }


Последний раз редактировалось i.o.; 27.11.2011 в 01:04.
Старый 27.11.2011, 01:20
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 24  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Цитата:
var movies:Vector.<MovieClip> = ...;
var sprites:Vector.<Sprite> = Vector.<Sprite>(movies);
И что после кучи таких преобразований туда-сюда мы все еще будем выигрывать по скорости у Array?
Не будем мы выигрывать. Но случаи то всякие бывают: например метод принимает только Vector.<Sprite>, а мы тут Vector.<MovieClip> везде таскаем.

Еще у Array есть одно преимущество перед Vector, которое обычно не учитывают:
Операции типа splice и concat работают вдвое быстрее.
Однажды удивился падению производительности после замены на вектор и вернул обратно, а потом уже в сети на тесты производительности наткнулся.


Последний раз редактировалось expl; 27.11.2011 в 01:25.
Старый 27.11.2011, 01:38
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 25  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
@i.o. ага здорово, твоя правда
но сути это, к сожалению, не меняет: обделен AS такой красотой

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Типизации нет вот тут
Извиняюсь, а Vector-то здесь в чем виноват?
Цитата:
Это легко проверить декомпилировав флешку.
Декомпилировав флэшку, Вы увидите декомпилированную флэшку. Уж наверное декомпилятор в состоянии узнать в рассматриваемом коде шаблонный векторный класс и восстановить "исходник".
Цитата:
Более того я могу создавать вектор любого типа в run time.
Очень интересно взглянуть. Покажите мне создание вектора Vector.<Sprite> без дословной директивы компилятору "Vector.<Sprite>", мне правда интересно.
__________________
Reality.getBounds(this);

Старый 27.11.2011, 03:51
fljot вне форума Посмотреть профиль Отправить личное сообщение для fljot Найти все сообщения от fljot
  № 27  
Ответить с цитированием
fljot

блогер
Регистрация: Jul 2007
Сообщений: 940
Записей в блоге: 3
Цитата:
Сообщение от Inet_PC Посмотреть сообщение
На самом деле компилятор не создает никаких новых классов. Это легко проверить декомпилировав флешку. Более того я могу создавать вектор любого типа в run time. Что так же говорит об этом же.
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Очень интересно взглянуть. Покажите мне создание вектора Vector.<Sprite> без дословной директивы компилятору "Vector.<Sprite>", мне правда интересно.
Код AS3:
var def:String = "__AS3__.vec::Vector.<%class%>";
var v:* = new (getDefinitionByName(def.replace("%class%", "flash.display::Sprite")));
trace(getQualifiedClassName(v));
v.push(new Sprite());
v.push(new Bitmap());
?

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Вот, спасибо, fljot! Это убедительно.
Теперь разберем вопрос автора.
Код AS3:
var ccc:String = "__AS3__.vec::Vector.<flash.display::Sprite>";
var v:* = new (getDefinitionByName(ccc));
trace(getQualifiedClassName(v));
trace(v is Vector.<*>)
var s1:Sprite = new Sprite();
s1.name = "First";
var s2:Sprite = new Sprite();
s2.name = "Second";
v.push(s1);
v.push(s2);
removeElementFromVector(v, s1);
trace(v[0].name);
 
public static function removeElementFromVector(v:Vector.<*> , searcher:* ):void
{
	for (var i:int = 0; i < v.length; i++ )
	{
		if ( v[i] == searcher ) v.splice( i , 1 );
	}
}
Если же это не устраивает, и хочется вместо звездочки иметь переменную, содержащую ссылку на класс, то сначала попробуйте скомпилить этот пример:
Код AS3:
var c:Class = Sprite;
function test(value:c):void { }
Я так и не понял претензий к Вектору и его типизации. То, что хак с getDefinitionByName работает, конечно грубость, но, в общем, нет генериков это нет генериков, что ж тут удивляться необычности реализации. Тем не менее в поведении as3-шного вектора я не вижу ничего непредсказуемого или нелогичного.
__________________
Reality.getBounds(this);

Старый 27.11.2011, 04:49
fljot вне форума Посмотреть профиль Отправить личное сообщение для fljot Найти все сообщения от fljot
  № 29  
Ответить с цитированием
fljot

блогер
Регистрация: Jul 2007
Сообщений: 940
Записей в блоге: 3
Wolsh, да посмотри мой давний вопрос по ссылке —*там более по-человечески задано было. Аргумент никаким векторным типом задать нельзя, только * или Object, зато в теле функции без проблем можно кастовать к Vector.<*>

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Я хоть убей не понимаю, как может "вектор, у которого все элементы могут быть только Спрайтами", перекастован в "вектор, у которого элементы могут быть чем угодно". Это реально баг с is. Реально даже строка
Код AS3:
var v:Vector.<*> = new Vector.<Sprite>;
логически неверна и не должна компилиться. А она компилится, но при этом компилятор не даст добавить в v ничего кроме Спрайта. Я поспешил с "не вижу ничего нелогичного". Спасибо еще раз за доходчивость.
__________________
Reality.getBounds(this);

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

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

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


 


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


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