2010-09-11 5 views
2

Ce code est écrit en langage ActionScript simple, mais je suppose que ce problème se produira dans toutes les langues qui ont des types de données booléens.Toggling Boolean Problème

Je clique simplement sur la scène pour que ma variable booléenne inverse sa valeur et que trace/imprime/enregistre sa nouvelle valeur. Cependant, il trace toujours vrai au lieu de basculer entre vrai et faux pour chaque clic de souris.

ce que je fais mal?

var myBool:Boolean; 

stage.addEventListener(MouseEvent.CLICK, mouseClickHandler); 

function mouseClickHandler(evt:MouseEvent):void 
    { 
    changeBoolean(myBool); 
    } 

function changeBoolean(boolean:Boolean):void 
    { 
    boolean = !boolean; 
    trace(boolean); 
    } 

Répondre

5

Vous passez une valeur à la fonction, pas à la référence. Cela signifie que la valeur booléenne de votre fonction changeBoolean est copiée à partir de la variable myBool. Ainsi, lorsque vous l'avez modifiée dans la fonction, elle n'a pas vraiment changé la variable myBool. Il existe essentiellement deux solutions à ceci:

  1. changer la fonction de ne pas accepter les paramètres et à l'intérieur changement de variable myBool ou
  2. changer la fonction afin qu'elle retourne le paramètre booléen et appelant la fonction, réglez le myBool valeur au résultat de la fonction
+0

ah ... est logique. Puisque j'utilise de nombreuses variables booléennes, je vais simplement inverser le booléen pendant que je passe sa valeur: changeBoolean (myBool =! myBool); – TheDarkIn1978

+0

J'ai trouvé cela déroutant parce que si je passais d'autres objets, comme des objets d'affichage, à une fonction alors je peux les changer. cela signifie-t-il que les types de données primitifs ne sont transmis qu'aux fonctions que comme leur valeur, tandis que les autres types de données non primitifs sont transmis comme eux-mêmes? est-ce la règle générale? – TheDarkIn1978

+1

Oui, les types de valeur sont transmis par valeur, tandis que les types de référence sont transmis comme références (et tout ce que vous faites avec eux dans la fonction les affecte également en dehors de la fonction). Les types de référence sont généralement des classes, tandis que les types de valeurs sont généralement des types de systèmes (booléen, entier, char, etc.), des énumérations et des structures. –

4

Dans la fonction changeBoolean, vous changez la valeur du boolean (nom pauvre, par la voie - essayez d'éviter les collisions de noms avec intégré types, même avec boîtier différent) paramètre. Cela n'a aucun effet en dehors de cette fonction.

Vous souhaitez modifier la valeur de myBool (que j'appellerais un champ de classe dans .Net ou Java) à la place.

function mouseClickHandler(evt:MouseEvent):void 
    { 
    myBool = !myBool; 
    trace(myBool); 
    } 

... est ce que je ferais (encore une fois, avec une compréhension naïve d'ActionScript).