2008-12-02 7 views
4

Existe-t-il un moyen d'examiner les signatures de fonctions anonymes dans ActionScript 3 pendant l'exécution?Vérification des signatures de fonction anonymes lors de l'exécution (réflexion) dans AS3

Je voudrais valider Function objets passés en arguments d'autres fonctions et assurez-vous qu'ils acceptent le bon nombre d'arguments (avec les types corrects) et renvoyer une valeur du type correct.

flash.utils.describeType() ne semble pas retourner cette information pour les fonctions anonymes.

+0

Hey hasseg, vous devriez envisager d'ajouter votre commentaire sournois comme une réponse à ce problème: "laisser l'appel jeter une ArgumentException" et l'attraper. C'est une solution très pragmatique si vous voulez juste appeler la fonction si elle est valide. – aaaidan

Répondre

4

Il ne semble pas que le runtime vous permette de réfléchir sur des fonctions anonymes, ce qui est dommage.

Les fonctions anonymes sont (peut-être par définition) marquées dynamic. Si vous passez un type incompatible dans une fonction anonyme, aucune erreur n'est levée. Toute incompatibilité de type sera silencieusement moulée du mieux possible. En passant quelque chose comme "minotaur" comme un paramètre uint donnera 0 (zéro), par exemple.

Si vous voulez vraiment le sur-concevoir, vous pouvez obtenir tous les OO dessus. Au lieu d'accepter des fonctions anonymes, vous pouvez déclarer une interface qui contient la signature de fonction appropriée et accepter les objets qui implémentent cette interface.

public interface IFancyCallback { 
    public function fancyFunction(frog:Frog, princess:Girl):UsefulReturnType; 
} 

Et votre fonction serait tout simplement être emballé dans un objet:

public class ConcreteCallback implements IFancyCallback { 
    public function fancyFunction(frog:Frog, princess:Girl):UsefulReturnType { 
    princess.kiss(frog); 
    return new UsefulReturnType("jabberwocky"); 
    } 
} 

pourrait avoir le potentiel de créer beaucoup de frais généraux de code. Dépend du nombre de rappels que vous avez l'intention d'avoir, de qui va les faire, et de la gravité de la situation si la signature de la fonction anon était incorrecte.

Pouvez-vous partager plus sur le problème que vous essayez de résoudre?

+0

pour la réponse - je n'avais aucune idée qu'aucune erreur ne serait lancée si vous essayez de transmettre des arguments de mauvais types. – hasseg

1

Comme une approximation grossière, vous pouvez vérifier le nombre de paramètres à l'aide de la propriété longueur, .: par exemple

function doStuff(callback:Function) { 
    trace(callback.length); 
} 

Je ne suis pas au courant d'aucun moyen d'énumérer les arguments d'une fonction anonyme; vous pouvez bien sûr valider l'argument ArgumentError ex-post.

+1

Merci - maintenant que j'y pense, ce n'est pas vraiment un problème si je ne valide pas la fonction et laisse simplement l'appel lancer une ArgumentException si la signature est invalide puisque c'est probablement ce que je ferais de toute façon :) – hasseg

Questions connexes