2009-06-09 5 views
2

J'ai testé le code suivant:AS3 ... (suite) Paramètre

function aa(...aArgs):void 
{ 
    trace("aa:", aArgs.length); 
    bb(aArgs); 
} 
function bb(...bArgs):void 
{ 
    trace("bb:", bArgs.length); 
} 
aa(); //calling aa without any arguments. 

La sortie est:

aa: 0 //this is expected. 
bb: 1 //this is not! 

Quand je passe des arguments vides (aArgs) à bb fonction; ne devrait-il pas retourner 0 longueur? On dirait que la fonction bb traite les aArgs passées comme non-vides/non-nulles.

Que manque-t-il ici?

Toute aide est appréciée. salutations ..

Répondre

9

Il semble que aArgs va à la fonction bb() serait un tableau vide, mais un tableau pas moins ... Je dirais que la sortie est à prévoir. Je ne suis pas vraiment sûr que la façon dont je le formater différemment que pour obtenir la sortie désirée ...

Mise à jour 1:

Je voulais clarifier un peu. Ce que vous avez est fondamentalement la même chose que:

function aa(...aArgs):void 
{ 
    myArray:Array = aArgs; 
    bb(myArray); 
} 
function bb(...bArgs):void 
{ 
    trace("bb:", bArgs.length); 
} 
aa(); //calling aa without any arguments. 

Si vous avez vu ce code, vous attendez bb: 1 oui?

Mise à jour 2:

Ce fil: filling in (...rest) parameters with an array? semble que ce serait pertinent. Il utilise la fonction apply() pour passer dans un tableau en tant que liste de paramètres. http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Function.html#apply()

+0

Je vois. Merci. L'appel de bb.apply (null, args) dans la fonction aa fonctionnera sûrement dans cet exemple. (Je voterais votre réponse si j'avais le 15 représentant.) Mais en fait, j'essaye de passer les arguments à une variable. Tels que: function aa (... args) {someVariable = args; } et le si j'utilise plus tard cette variable dans bb (... args) fonctionne comme: bb (someVariable); - Cela ne fonctionnera pas .. –

+0

Cela devrait encore fonctionner avec l'appliquer. rappelez-vous juste que le somveVariable est un tableau et donc vous aurez besoin de apply() pour pouvoir passer les éléments individuels dans le tableau. –

+0

Non, il ne .. S'il vous plaît voir le fil à http://stackoverflow.com/questions/972460/as3-arguments Je ne peux pas ajouter de code ici, donc je devais poser une nouvelle question .. –

2

Ceci est parfaitement logique et fonctionne correctement. ... reste crée toujours un tableau, s'il n'y a pas de valeurs passées, il crée un tableau vide, comme vous le voyez en traçant sa longueur. Donc la raison pour laquelle bb a un objet dans son tableau ... rest est que vous passez le tableau vide dans bb comme une valeur, qui est insérée dans la première position du tableau généré par bb's ... rest, lui donnant un longueur d'un.

+0

Oui Je suis d'accord avec tout ce qui précède. Mais c'est juste décrire la nature du problème .. ne pas nous fournir la solution appropriée, encore .. En outre; Je dois garder la fonction débordement et leurs paramètres intacts (puisque ce code est une version simple d'une classe complexe). En tout cas, je suis venu avec une solution avec l'aide de vous tous ..Vous pouvez le trouver ici: http://stackoverflow.com/questions/972460/as3-arguments Cela peut ne pas sembler une approche très insaisissable/différente, mais c'est juste la chose dont j'avais besoin. –

6

Je ne sais pas si cela est encore pertinent, mais vous pouvez essayer ceci:

function aa(...aArgs):void { 
    var myArray:Array = aArgs; 
    bb.apply(this, myArray); 
} 
function bb(...bArgs):void { 
    trace("bb:", bArgs.length); 
} 
aa(); //calling aa without any arguments. 

Fondamentalement Function.apply est votre ami ici.

+0

Merci .. question résolue ici: http://stackoverflow.com/questions/972460/as3-arguments/972518#972518 –