2013-04-10 2 views
0

Si je déclare une fonction comme ceci:AS3 « Erreur: Valeur de retour doit être défini »

public function foo():void 
{ 
    // do something 
} 

Parfois, dans cette fonction, je pourrais décider de début-out, souvent avec un message de journal, comme suit:

public function foo():void 
{ 
    if(somethingWentWrong) 
    { 
     log("blah blah"); 
     return; 
    } 

    // do something 
} 

log() est essentiellement un wrapper pour trace(), avec la signature public function log(msg:String):void

pour économiser un peu d'espace, je pourrais réécrire le chèque et précoce vers ceci:

public function foo():void 
{ 
    if(somethingWentWrong) 
     return log("blah blah"); 

    // do something 
} 

Cette compile et fonctionne sans problème à 99% du temps, sauf, de temps en temps (quand il y a un bogue dans une autre partie sans rapport du projet, ou je fais un nettoyage), je vais une erreur de compilation sous forme de:

"Error: Return value must be undefined" 

Et je dois réécrire sous la forme longue afin de compiler. Une fois compilé, je peux ensuite le renvoyer à sa version courte et tout est de nouveau heureux. Quand cette erreur se produit cependant, c'est irritant et je n'aime pas avoir à réécrire le code en introduisant 3 lignes de redondance. Une idée de pourquoi ça se passe (et seulement très occasionnellement) et comment je peux l'arrêter à court d'écrire la forme longue partout? Techniquement, voir log() renvoie void, il ne devrait pas y avoir de problème.

Répondre

2

votre déclaration de fonction:

public function foo():void 

suggère que votre fonction ne doit pas retourner quoi que ce soit, donc si je vous, je venais de faire

log("blah blah"); 
return; 

au lieu de

.

La deuxième version est mauvaise, et pas seulement parce que cela ne fonctionne pas toujours, mais aussi pour tous les lecteurs de votre code pour supposer que log renvoie une valeur, alors que ce n'est pas le cas.

il rend votre code plus difficile à grok.

+0

bon point sur le code étant plus difficile à grok – divillysausages

1

Si une fonction est de 'renvoyer' une valeur, alors le type doit être défini.

Vous avez la fonction définie comme 'void', mais vous essayez de 'renvoyer' une valeur.

Si vous avez l'intention de retourner une valeur, c'est la bonne façon d'écrire votre fonction:

// if you want to return a value, you must specify the type 
public function foo():String 
{ 
    if(somethingWentWrong) 
    { 
     // I am assuming that log returns a String 
     return log("blah blah"); 
    } 
     else 
     { 
      return null; 
     } 
} 

En outre, si vous spécifiez le type de retour, la fonction doit renvoyer une valeur. En fonction de ce que vous essayez de faire, il semble que vous deviez également vous assurer que votre fonction de journal renvoie une chaîne. La signature de la fonction doit être:

public function log(msg:String):String 

et il DEVRAIT retourner une chaîne.

+0

Je n'ai jamais voulu retourner quoi que ce soit, juste pour éviter 3 lignes de code redondant. vu que 'foo()' et 'log()' sont tous les deux de type 'void', techniquement cela ne devrait faire aucune différence disant' return log(); '- ça marche, c'est frustrant que ça échoue à des moments aléatoires. J'obtiens votre point si – divillysausages

+0

j'ai mal compris cet aspect, désolé. Je ne pense pas avoir déjà rencontré ce problème, car si je ne retourne pas quelque chose, je n'utiliserais pas 'return log (" bla bla "),', je le ferais comme l'autre être clair. Mais oui .. puisque le log est nul, techniquement ça devrait marcher. – prototypical

Questions connexes