Question

Avez-vous une idée de la façon dont renvoyer plusieurs variables à partir d'une fonction dans ActionScript 3?

Quelque chose comme VB.NET où vous pouvez faire modifier la variable de l'argument d'entrée (arguments de ByRef)?

Sub do (ByRef inout As Integer)
 inout *= 5;
End Sub

Dim num As Integer = 10
Debug.WriteLine (num)        '10
do (num)
Debug.WriteLine (num)        '50

Quelque chose mis à part renvoyer un tableau associatif ?

return {a:"string 1", b:"string 2"}
Était-ce utile?

La solution

Tout dans AS3 est une référence à part [u] ints. Pour généraliser, tout ce qui hérite de Object sera donné à la fonction par une référence.

Cela étant dit, la seule façon de le faire est d'utiliser une classe conteneur telle qu'un tableau ou un chaîne ("5") et effectuer la conversion. + math).

Autres conseils

Citation d'une source googlé:

  

Dans ActionScript 3.0, tous les arguments sont passés par référence car toutes les valeurs sont stockées en tant qu'objets. Toutefois, les objets appartenant aux types de données primitifs, notamment Boolean, Number, int, uint et String, ont des opérateurs spéciaux qui les font se comporter comme s'ils avaient été passés par valeur.

Ce qui m'a amené à rechercher le source canoniale . .

Il semble que les chaînes, les unités, les unités et les booléens soient passés par valeur. J'ai essayé ce petit extrait en Flash et les résultats ont été négatifs:

function func(a:String){
    a="newVal";
}

var b:String = "old";

trace(b)    //  old
func(b);
trace(b)    //  old

Alors ... est-ce que String est aussi un type de données sur la liste noire? Booléen aussi? Je veux dire quel est un moyen sûr de dire quels types sont passés par référence?

Tout est par valeur. Si vous comprenez la programmation en C, vous serez familiarisé avec le concept de pointeurs.

Pensez à un pointeur qui pointe vers quelque chose en mémoire et à tous les noms de variable "bob from (bob = new person ();)" Ce sont essentiellement des pointeurs avec lesquels vous travaillez.

Maintenant, quand vous déclarez une fonction, puisqu'elles sont toutes Par valeur

function Test(a:Object, b:Object):void {
   a = b;
}

Vous pouvez penser à la fois & a; " et " b " étant de nouveaux pointeurs, donc uniquement dans le champ "Test". fonction faire à la fois & a; " et " b " existe et pointe vers quelque chose en mémoire.

Alors utilisons-le

var s1:Sprite = null;
var s2:Sprite = new Sprite;
Test(s1,s2);

Ainsi, les pointeurs s1 et s2 pointeront TOUJOURS sur "null". et "un nouveau Sprite en mémoire" respectivement, à moins qu'ils ne soient modifiés en tant que s1 et s2 dans leur "Scope" < - Assurez-vous de bien comprendre la portée variable avant même d’essayer de résoudre ce problème.

Et au sein de la fonction, nous avons maintenant deux nouveaux pointeurs "un" pointant vers " null " et " b " en pointant sur "le même sprite en mémoire que s2". Ainsi, puisque les objets et les tableaux sont essentiellement des ensembles de pointeurs et que seuls deux nouveaux pointeurs ont été créés par la fonction d'utilisation "a". et " b " toute propriété / variable exposée "pointeurs sur des données en mémoire" de " a " ou " b " seront toujours exactement les mêmes que ceux de " s1 " et " s2 " et sont les mêmes pointeurs.

Donc, dans la fonction, lorsque " a " se prépare à être "b", en réalité tout ce qui se passe est le "a" le pointeur pointe maintenant vers la même chose que "b". Mais " s1 " et " s2 " toujours indiquer ce à quoi ils faisaient référence avant.

!!!! Si c’était par référence, vous ne pourriez pas penser à "a" et " b " en tant que nouveaux pointeurs, ils seraient en réalité "& s;" " et " s2 " eux-mêmes, sauf que vous les écrivez en tant que " un " et "b".

Wrong Wrong Wrong et Wrong .. chaque argument est passé par valeur !!! le fait que vous puissiez modifier une propriété dans l'objet transmis ne signifie pas que vous pouvez modifier l'objet lui-même. essayez le code suivant

function Test(a:Object, b:Object):void {
   a = b;
}

function Test2():void {
   var s1:Sprite = null;
   var s2:Sprite = new Sprite;

   Test(s1,s2);
   Trace(s1);
   Trace(s2);
}

et voici le résultat de la trace:

null
[object Sprite]

Notez la différence subtile entre l'exemple de DarthZorG et celui des documents Flash:

function passByRef(objParam:Object):void 
{ 
    objParam.x++; 
    objParam.y++; 
    trace(objParam.x, objParam.y); 
} 
var objVar:Object = {x:10, y:15}; 
trace(objVar.x, objVar.y); // 10 15 
passByRef(objVar); // 11 16 
trace(objVar.x, objVar.y); // 11 16

Point Being: Vous ne pouvez pas modifier le contenu de la référence mais vous pouvez également modifier les données de cette référence tant que cette référence est un objet / un tableau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top