Создать и определить Вектор - PullRequest
0 голосов
/ 12 мая 2010

Я ищу метод для создания вектора и выдачи некоторых значений без определения переменной вектора Например:

У меня есть функция:

public function bla(data:Vector.<Object>):void { ... }

эта функция ожидает Vector в качестве параметра. Я могу передать параметры таким образом

var newVector:Vector.<Object> = new Vector.<Object>();
newVector.push("bla1");
newVector.push("bla2");
bla(newVector);

Могу ли я сделать это в одной строке во Flex? Я ищу что-то вроде:

bla(new Vector.<Object>().push("bla1").push("bla2"));

Я тоже пробовал это:

bla(function():Vector.<Object> { var result:Vector.<Object> = new Vector.<Object>(2, true); result.push("bla1"); result.push("bla2"); return result; });

Но он жалуется:

1067: Implicit coercion of a value of type Function to an unrelated type __AS3__.vec:Vector.<Object>...

Спасибо

Ответы [ 4 ]

3 голосов
/ 12 мая 2010

Вы не можете связать Vector.push() вызовы, поскольку они возвращают uint - новую длину вектора.
С другой стороны, проблема принуждения возникает из-за того, что вы передаете функцию в bla функция, которая ожидает Vector.<Object>.

Вы можете легко это исправить:

bla((function():Vector.<Object> {
    var result:Vector.<Object> = new Vector.<Object>(2, true);
    result.push("bla1");
    result.push("bla2");
    return result; })()
);

Однако в AS3 уже есть функция верхнего уровня, которая помогает вам создавать векторы.Функция Vector() ожидает либо Array, либо Vector и возвращает Vector.Так, например, вы можете использовать:

bla(Vector.<Object>(['bla1', 'bla2']));

Посетите AS3 Reference для получения дополнительной информации.

РЕДАКТИРОВАТЬ: Я забыл упомянутьчто исправление в подходе к функции было просто добавлением () к нему, что означает, что мы на самом деле вызвали анонимную функцию и передали ее возвращение функции bla.

1 голос
/ 31 января 2011

Просто хочу отметить, что push принимает несколько аргументов, и каждый из них последовательно помещается в стек:

function getVector():Vector.<String>
{
    var newVector:Vector.<String> = new Vector.<String>();
    newVector.push("blah1","blah2","blah3","blah4");
    return newVector;
}
0 голосов
/ 12 мая 2010

Вы не можете сделать это:

bla(new Vector.<Object>().push("bla1").push("bla2"));

потому что метод "push" возвращает длину вектора. Так что это означает, что вы пытаетесь вставить String"bla2" в int 1. Это не сработает!

И ваш следующий пример - передача функции методу bla, не вызывая эту функцию и передавая возвращенный Vector.

Также вы говорите, что тип Vector - «Объект», но вы передаете в строках. Вы должны сделать это:

Vector.<String>

Вы могли бы сделать что-то вроде этого:

function getVector():Vector.<String>
{
    var newVector:Vector.<String> = new Vector.<String>();
    newVector.push("bla1");
    newVector.push("bla2");
    return newVector;
}

bla( getVector() );
0 голосов
/ 12 мая 2010

Я не совсем уверен, почему вам нужно сделать это одной строкой. Вы всегда можете написать класс-обертку, если вам часто приходится это делать. Класс-обертка может иметь метод push, который возвращает ссылку на исходный объект, чтобы вы могли использовать первый метод, который вы хотели.

Вы также можете написать вспомогательную функцию, которая создаст новый вектор и добавит элементы в вектор, а затем вернет вектор.

Есть ли особая необходимость в желании сделать это в одной строке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...