2008-09-08 7 views

Répondre

7

Je crois que le mieux que vous pouvez faire est de passer un objet conteneur comme argument à une fonction et modifier les valeurs de certaines propriétés dans cet objet:

function swapAB(aValuesContainer:Object):void 
{ 
    if (!(aValuesContainer.hasOwnProperty("a") && aValuesContainer.hasOwnProperty("b"))) 
     throw new ArgumentError("aValuesContainer must have properties a and b"); 

    var tempValue:int = aValuesContainer["a"]; 
    aValuesContainer["a"] = aValuesContainer["b"]; 
    aValuesContainer["b"] = tempValue; 
} 
var ints:Object = {a:13, b:25}; 
swapAB(ints); 
+1

hasseg, je tiens à l'espoir que quelqu'un connaît un truc qui est plus élégant, mais il semble probable que votre réponse est la meilleure. Je suppose que le suivi naturel est: Est-ce que cette limitation pousse quelqu'un d'autre fou, ou est-ce juste moi? :) –

+0

ça me rend un peu fou de temps en temps. Je ne pense pas que vous êtes trop seul sur celui-là. –

-2

Si ActionScript fonctionne comme Javascript,

[a,b] = [b,a] 
+0

Désolé, mais cela ne fonctionne pas dans ActionScript – Turambar

4

Je suppose une alternative serait de définir quelque part ce genre de chose ...

public class Reference { 
    public var value:*; 
} 

Ensuite, utilisez des fonctions qui prennent un certain nombre d'arguments de référence pour agir comme des "pointeurs" si vous cherchez vraiment des paramètres "out" et les initialisez ou non et votre swap devient:

function swap(Reference a, Reference b) { 
    var tmp:* = a.value; 
    a.value = b.value; 
    b.value = tmp; 
} 

et vous pouvez toujours aller de noix et de définir IntReference spécifiques, StringReference, etc.

3

vous pouvez également utiliser un wrapper au lieu de int:

public class Integer 
{ 
    public var value:int; 

    public function Integer(value:int) 
    { 
     this.value = value; 
    } 
} 

Bien sûr, cela serait plus utile si vous pouvez utiliser surcharge de l'opérateur ...

4

Ceci est tatillon, mais int, String, Number et les autres sont passée par référence, il est juste qu'ils sont immuables. Bien sûr, l'effet est le même que si elles étaient passées en valeur.

1

C'est embêtant. Mais si vous utilisez des idiomes différents de ceux par ex. C#, vous pouvez obtenir des résultats de qualité raisonnable. Si vous devez passer beaucoup de paramètres, passez un objet rempli avec les données nécessaires et modifiez les paramètres de l'objet lorsque vous revenez. La classe Object est juste pour ce genre de chose.

Si vous avez juste besoin de renvoyer un tas de données, renvoyez un objet. Cela est plus conforme au style ECMAScript que la sémantique pass-by-ref.

0

L'affectation destructrice (par exemple [a, b] = [b, a]) n'est pas définie dans la spécification ECMA-262 3 et n'est pas implémentée dans JavaScript 1.5, qui est la version équivalente de l'implémentation JScript dans C'EST À DIRE. J'ai vu cette syntaxe dans l'aperçu des spécifications AS4 cependant, et je crois que cela fait partie de JavaScript 1.7.

2

Regardez simplement du code Java. Java a eu la convention que les types de référence sont passés par référence et les types primitifs sont passés par valeur depuis sa création. C'est un très bon modèle à bien des égards.

Mais parler de swap, la meilleure et la meilleure façon de faire un échange en Java/AS3 est avec les trois lignes suivantes:

 
var temp:int = array[i]; 
array[j] = array[i]; 
array[i] = temp; 

Theres pas vraiment aucune raison d'utiliser une fonction pour faire un simple échange , quand vous pouvez le faire plus vite avec seulement 3 lignes.

Questions connexes