2010-05-11 6 views
0

Je cherche une méthode pour créer un vecteur et pousser quelques valeurs sans définir de vecteur variable. Par exemple:Créer et définir le vecteur

Je fonction:

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

cette fonction attend Vector en tant que paramètre. Je peux transmettre des paramètres de cette façon

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

Puis-je le faire en une ligne dans Flex? Je cherche quelque chose comme:

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

J'ai aussi essayé ceci:

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

Mais il se plaint:

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

Merci

Répondre

3

Vous ne pouvez pas la chaîne Vector.push() appels comme ils reviennent uint « s - la nouvelle longueur du vecteur. D'autre part, le problème de coercition se produit parce que vous passez une fonction à la fonction bla, qui attend un Vector.<Object>.

Vous pouvez corriger cela facilement:

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

Cependant, il y a déjà une fonction de haut niveau en AS3 qui vous aide à créer des vecteurs. La fonction Vector() attend un Array ou un Vector et renvoie un Vector. Ainsi, par exemple, vous pouvez utiliser:

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

Visitez le AS3 Reference pour plus d'informations.

EDIT: Je oublié de mentionner que le correctif sur l'approche de la fonction était simplement l'ajout d'un () à elle, ce qui signifie que nous fait appelé la fonction anonyme et il est passé revenir à la fonction bla.

+0

Merci, je l'ai trouvé moi-même déjà. La fonction Vector() a fait ce tour pour moi. – zinovii

0

Je ne suis pas vraiment bien sûr pourquoi vous auriez besoin de le faire une ligne. Vous pouvez toujours écrire une classe wrapper si vous le faites souvent. La classe wrapper peut avoir une méthode push qui renvoie une référence à l'objet d'origine afin que vous puissiez utiliser la première méthode souhaitée.

Vous pouvez également écrire une fonction d'assistance qui a créé un nouveau vecteur et ajouté les éléments au vecteur, puis renvoyé le vecteur.

Y a-t-il un besoin particulier de vouloir cela sur une ligne?

0

Vous n'êtes pas en mesure de le faire:

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

parce que la méthode « push » renvoie la longueur du vecteur. Donc ce que cela signifie est que vous essayez de pousser le String "bla2" sur le int 1. Cela ne fonctionnera pas!

Et votre prochain exemple passe une fonction à la méthode bla, n'appelant pas cette fonction et passant le vecteur retourné.

Aussi vous dites que le type de vecteur est "Objet" mais que vous passez dans les chaînes. Vous devriez faire ceci:

Vector.<String> 

Vous pouvez faire quelque chose comme ceci:

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

bla(getVector()); 
1

veux juste mentionner pousser prend plusieurs arguments, et chacun est poussé sur la séquence de la pile:

function getVector():Vector.<String> 
{ 
    var newVector:Vector.<String> = new Vector.<String>(); 
    newVector.push("blah1","blah2","blah3","blah4"); 
    return newVector; 
} 
Questions connexes