Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Тип Vector.<*> в роли аргумента (http://www.flasher.ru/forum/showthread.php?t=160426)

fljot 12.07.2011 18:45

Тип Vector.<*> в роли аргумента
 
Векторы доступны уже года два наверное, а я до сих пор не могу понять как же так.

Код AS3:

var v:Vector.<Sprite> = new Vector.<Sprite>();
trace(v is Vector.<*>);// true
var foo:Vector.<*>;
//foo = v;// Implicit coercion of a value of type __AS3__.vec:Vector.<flash.display:Sprite> to an unrelated type __AS3__.vec:Vector.<*>.
foo = v as Vector.<*>; // OK
var bar:Vector.<Sprite> = foo as Vector.<Sprite>;// OK
 
genericArgument(v);// true, 0, Hello from genericArgument()
//typedArgument(v);// Implicit coercion of a value of type __AS3__.vec:Vector.<flash.display:Sprite> to an unrelated type __AS3__.vec:Vector.<*>.
 
function genericArgument(value:*):void
{
        var foo:Vector.<*> = value as Vector.<*>;
        trace(foo is Vector.<*>, foo.length); // true, 0
        trace("Hello from genericArgument()");
}
 
function typedArgument(value:Vector.<*>):void
{
        trace("You won't see this message");
}


Aquahawk 12.07.2011 19:18

а зачем вам нетипизированный вектор? Это бред, извините. Если типизация, то вектор. Если не типизация - Array. Используйте array и всё будет хорошо. Либо явно указывайте что хотите принять.

fljot 12.07.2011 19:20

Для VectorUtils хотя бы

i.o. 12.07.2011 19:21

Vector.<*> и Vector.<Sprite> - это разные векторы.
Вот правда я не понял, почему адоб не сделал Vector.<Sprite> is Vector == true
На данный момент false. Т.е любой вектор это не вектор..

fljot 12.07.2011 19:25

Цитата:

Сообщение от i.o. (Сообщение 1011138)
Vector.<*> и Vector.<Sprite> - это разные векторы.
Вот правда я не понял, почему адоб не сделал Vector.<Sprite> is Vector == true
На данный момент false. Т.е любой вектор это не вектор..

Перечитайте пример — там вчастности показано, что Vector.<Sprite> is Vector.<*>

i.o. 12.07.2011 19:26

что ж тогда у вас RTE вылетает?
Цитата:

Implicit coercion of a value of type __AS3__.vec:Vector.<flash.display:Sprite> to an unrelated type __AS3__.vec:Vector.<*>

fljot 12.07.2011 19:29

В этом и вопрос, такое случается только при передаче в аргументы.

upd: И это не RTE, a compile-time error

maxkar 12.07.2011 19:32

Цитата:

Сообщение от i.o. (Сообщение 1011138)
Вот правда я не понял, почему адоб не сделал Vector.<Sprite> is Vector == true
На данный момент false. Т.е любой вектор это не вектор..

И правильно. Это действительно разные векторы. Иначе можно было бы делать так:
Код AS3:

const v : Vector.<Sprite> = new Vector.<Sprite>();
const v1 : Vector = v;
v1.push(3);
trace(v[0]);

Что должно было бы быть в результате - не понятно.

wvxvw 12.07.2011 19:37

В таком контексте - баг, или, вернее, недоработка, не известно когда поправят. (Изначально Vector.<*> вообще не было, и его чего-то как-то не торопятся довести до ума...)

ЗЫ. Aquahawk:
Даже в нетипизированом векторе есть смысл, например уже потому, что вектор - гарантировано dense т.е. в нем все индексы с 0 по length - 1 заполнены, в то время как в Array, ситуация выглядит примерно так: 0 .. first-non-empty + hash-table состоящая из индексов записаных как строки содержащие значения этих индексов в десятичном представлении... Т.е. по ситуации либо тот либо другой варианты могут работать гораздо лучше при сериализации, например.

i.o. 12.07.2011 19:39

Вариант первый (работает)
Код AS3:

var v:Vector.<Object> = new Vector.<Object>();
v.push(1.1);
v.push(2.2);
v.push(3.3);
v.push(4.4);
 
trace("v is Vector: " + (v is Vector));
trace("v is Vector.<*>: " + (v is Vector.<*>));
trace("v as Vector.<*>: " + (v as Vector.<*>));
trace("v as Vector.<Object>: " + (v as Vector.<Object>));
trace("v as Vector.<Number>: " + (v as Vector.<Number>));
 
typedArgument(v as Vector.<*>);
 
function typedArgument(value:Vector.<*>):void
{
        trace("typedArgument() -> value: " + value);
}

Цитата:

v is Vector: false
v is Vector.<*>: true
v as Vector.<*>: 1.1,2.2,3.3,4.4
v as Vector.<Object>: 1.1,2.2,3.3,4.4
v as Vector.<Number>: null
typedArgument() -> value: 1.1,2.2,3.3,4.4
Вариант второй (не работает, что собственно и должно быть)
Код AS3:

var v:Vector.<Number> = new Vector.<Number>();
v.push(1.1);
v.push(2.2);
v.push(3.3);
v.push(4.4);
 
trace("v is Vector: " + (v is Vector));
trace("v is Vector.<*>: " + (v is Vector.<*>));
trace("v as Vector.<*>: " + (v as Vector.<*>));
trace("v as Vector.<Object>: " + (v as Vector.<Object>));
trace("v as Vector.<Number>: " + (v as Vector.<Number>));
 
typedArgument(v as Vector.<*>);
 
function typedArgument(value:Vector.<*>):void
{
        trace("typedArgument() -> value: " + value);
}

Цитата:

v is Vector: false
v is Vector.<*>: false
v as Vector.<*>: null
v as Vector.<Object>: null
v as Vector.<Number>: 1.1,2.2,3.3,4.4
typedArgument() -> value: null
Цитата:

Что должно было бы быть в результате - не понятно.
RTE, что ж еще то.

Добавлено через 1 минуту
Кстати да. Вы попробуйте для начала создать
Код AS3:

var v:Vector = new Vector();



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

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