2009-05-08 4 views
11

Je voudrais mettre en œuvre la logique suivante:AS3: en déclarant un paramètre « indéfini » pour int, uint ou numéro

function setMyValue (myVar:int = undefined):void 
{ 
    if (myVar == undefined) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 

Donc, si la valeur est fournie, l'utiliser. Sinon, générez le. Cela semble assez simple.

Le problème est que AS3 n'aime pas cela. 'undefined' est converti en '0', donc myVar n'est jamais indéfini. J'ai essayé des variantes avec NaN, null, etc, mais rien n'a fonctionné. Le seul kludge que je puisse imaginer est de fournir un 'nombre magique' à utiliser par défaut, mais c'est moche. Quelqu'un sait-il une meilleure solution?

Merci!

+0

Ah, OK, numéro est légèrement différent. Number par défaut à NaN, de sorte que l'instance peut être gérée en utilisant isNaN (myVar). Toujours vouloir résoudre pour int et uint, cependant. – Wikiup

Répondre

14

UPD (de mon commentaire): Il est certainement pas une bonne pratique de choisir un certain nombre magique pour indiquer la valeur absence, à moins que vous pouvez être tout à fait sûr que ce nombre magique ne semble pas à la suite de certains arithmétique (ce qui est généralement vrai). Donc, pour fonctionner, ainsi que int, pour indiquer l'absence de valeur réelle de la meilleure approche est ici soit d'utiliser un type plus large que int (par exemple Number), ou passer un certain drapeau (valeur Boolean). Le choix devrait dépendre de si vous voulez souligner l'importance du fait que la valeur transmise est intégrale.


Si vous vous sentez à l'aise avec l'expansion type d'argument, alors vous devez utiliser NaN et faites ceci:

function setMyValue (myVar : Number = NaN) : void 
{ 
    if (isNaN(myVar)) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 

la fois plus précis sur le plan technique et il est également plus stable. Il vous permettra également de taper fortement au moment de la compilation et ne causerait pas de bogues bizarres comme dans le cas d'utilisation de Object.

Notez que cela ne fonctionnera pas avec int comme l'une des réponses suggère. int a seulement valeurs numériques, et NaN va obtenir sous la contrainte à 0. Vous aurez besoin d'utiliser le type Number.

Si vous êtes inquiet au sujet de la performance - ne soyez pas. L'utilisation de Number au lieu de int ou uint est généralement OK.


UPD: Si vous voulez marquer explicitement cet argument devrait faire partie intégrante il suffit d'utiliser le drapeau supplémentaire et le type exact - il serait beaucoup plus claire.

function setMyValue (isIntValueSupplied : Boolean = false, intValue : int = 0) : void 
{ 
    if (isIntValueSupplied) 
    { 
     /* Generate or use a default value of intValue */ 
    } 
    else 
    { 
     /* Use the supplied value for intValue */ 
    } 
} 

Une autre option est de définir votre propre type avec une valeur ajoutée, par exemple MaybeInt, qui contient une valeur entière et un indicateur (qu'il ait été initialisé ou non). De cette façon, vous devez indiquer clairement que la valeur doit être intégrale ou sans valeur. Cependant, cette approche peut être un peu encombrante.

+0

Cela se rapproche certainement, comme au moins je sais que c'est un nombre qui vient à travers le param (que je peux ensuite refondre à un int/uint), mais cela pose à peu près le même problème que mon problème avec la réponse de dirkgently. Est-il vraiment plus propre de classer le mauvais type de données? Peut-être que je demande simplement quelque chose qui ne peut pas être fait d'une manière vraiment propre. BTW, cela n'a rien à voir avec la performance en soi. J'essaie simplement d'établir une approche de meilleure pratique à ce problème. Merci pour l'aide! – Wikiup

+0

@Wikiup: Ce n'est certainement pas une bonne pratique de choisir un nombre magique pour indiquer l'absence de valeur, sauf si vous pouvez être complètement sûr que ce nombre magique n'apparaîtrait pas à cause de quelques arithmétiques (ce qui est généralement vrai). Donc, la meilleure approche est soit d'utiliser un type plus large que 'int' (par exemple' Number'), soit de passer un flag ('Boolean' value) pour fonctionner, ainsi que' int', pour indiquer l'absence de valeur réelle. Le choix devrait dépendre de si vous voulez souligner l'importance du fait que la valeur transmise est intégrale. – dragonfly

+0

Je pense que votre commentaire fournit une meilleure "meilleure pratique" solution que votre réponse originale. Je suis d'accord que les nombres magiques sont rarement une bonne idée (c'était, après tout, le point de mon affichage original). function setMyValue (useSuppliedValue: Boolean = false, suppliedValue: int = 0), tandis que wordier, semble fournir un format moins ambigu pour la méthode; Cela me semble être une réponse plutôt solide. Si vous voulez éditer votre réponse et l'écrire en tant que tel, je vérifierai avec plaisir 'répondre' et vous créditerai avec les points de rep. : c) Merci beaucoup! – Wikiup

2

La valeur générée est-elle const? Si c'est le cas, pourquoi ne pas simplement avoir ceci comme valeur par défaut?

Le problème est que AS3 n'aime pas cela. 'undefined' est converti en '0', donc myVar n'est jamais indéfini.

Oui, parce que, c'est la valeur d'initialisation par défaut pour int (pour string et Object être this'd null).

L'autre option est de taper sans serrer le paramètre comme un Object ou le garder non spécifié (en utilisant un *) et plus tard typecast à int si elle est non null.

function setMyValue (myVar:Object = null):void 
{ 
    if (myVar == null) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     int value = myVar as int; 
     /* Use the supplied value for myVar */ 
    } 
} 
+0

Appréciez la réponse rapide. La valeur générée n'est pas un const; il doit être généré au moment de l'appel de la méthode. Je suppose que ma question serait de lâcher de la sorte plus propre que d'utiliser un nombre magique? Le faire de la manière que vous suggérez signifierait que j'aurais besoin de nettoyer les données pour m'assurer qu'on ne me donne pas une valeur illégale (chaîne/nombre/microphone). Au moins en utilisant le nombre magique, un développeur connaîtrait le type de données requis. Je pense juste qu'il doit y avoir une manière plus propre de faire ceci. – Wikiup

+0

BTW, je vous ai aimé dans "Long Dark Tea Time ..."; c) – Wikiup

2

Ma solution était d'utiliser simplement ce

if(myUint == new uint){ is undefined, act appropriately; } 
+0

Le problème est que (new uint == 0) se résout à true. Donc, vous ne faites vraiment que tester si myUint == 0. –

0
function setMyValue (myVar:int = -1):void 
{ 
    if (myVar == -1) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 
Questions connexes