2009-06-09 8 views
2

Pourquoi pensez-vous que le code ci-dessous ne fonctionne pas? Que changeriez-vous/ajouteriez-vous pour le faire fonctionner?Arguments AS3

Toute aide est appréciée ..

function TraceIt(message:String, num:int) 
{ 
    trace(message, num); 
} 

function aa(f:Function, ...args):void 
{ 
    bb(f, args); 
} 

aa(TraceIt, "test", 1); 

var func:Function = null; 
var argum:Array = null; 

function bb(f:Function, ...args):void 
{ 
    func = f; 
    argum = args; 
    exec(); 
} 

function exec() 
{ 
    func.apply(null, argum); 
} 

Je reçois un ArgumentError (Error # 1063):

Argument count mismatch on test_fla::MainTimeline/TraceIt(). Expected 2, got 1. 

..so, le paramètre passé (de argum) ne fournit pas tous les arguments passés ..

..Veuillez garder la structure de la fonction (trafic) intacte .. J'ai besoin d'une solution utilisant les mêmes fonctions dans le même ordre .. Je dois passer les arguments à une variable et les utiliser dans le exec() méthode ci-dessus ..

ce qui a trait

+0

Quelles sont les erreurs? – CookieOfFortune

+0

Ajouté à l'article ci-dessus .. merci .. –

Répondre

7

Ok, voici la solution .. après avoir cassé ma tête)

function TraceIt(message:String, num:int) 
    { 
     trace(message, num); 
    } 

    function aa(f:Function=null, ...args):void 
    { 
     var newArgs:Array = args as Array; 
     newArgs.unshift(f); 
     bb.apply(null, newArgs); 
    } 

    aa(TraceIt, "test", 1); 

    var func:Function = null; 
    var argum:*; 

    function bb(f:Function=null, ...args):void 
    { 
     func = f; 
     argum = args as Array; 
     exec(); 
    } 

    function exec():void 
    { 
     if (func == null) { return; } 
     func.apply(this, argum); 
    } 

De cette façon, vous pouvez passer des arguments sous forme de variables à une autre fonction et les exécuter ..

Merci à tous prendre le temps d'aider ...

1

Quand TraceIt() est appelée par la suite, il est appelé avec 1 paramètre Array, pas des paramètres String et int.

Vous pouvez changer TraceIt() à:

function TraceIt(args:Array) 
{ 
    trace(args[0], args[1]); 
} 

Ou vous pouvez changer exec() à:

function exec() 
{ 
    func.apply(null, argum[0].toString().split(",")); 
} 

... tel qu'il apparaît lorsque vous passez "test", 1, vous finissez par array dont la première valeur est "test, 1". Cette solution ne fonctionne pas au-delà du cas trivial, cependant.

+0

merci, mais c'est une version très simple du code réel. Je veux dire le TraceIt représente toute fonction passée ... ce qui signifie qu'il diffère tout le temps .. –

1

Changer votre fonction bb pour ressembler à ceci:

function bb(f:Function, args:Array):void 
{ 
    func = f; 
    argum = args; 
    exec(); 
} 

Comme vous l'avez maintenant, il accepte un nombre variable d'arguments, mais vous passez dans un tableau (des arguments) de aa.

+0

Déjà essayé que dans le début .. Merci quand même ... Ma solution est ci-dessous .. –

+0

Eh bien cela fonctionne avec le code que vous avez posté. – Kekoa

+0

Pas même un upvote? Bienvenue dans le débordement de la pile. – Kekoa