2008-09-08 5 views
13

Actionscript 3.0 (und ich nehme an, Javascript und ECMAScript im Allgemeinen) fehlt Pass-by-Reference für native Typen wie Ints. Als Ergebnis finde ich, dass Werte von einer Funktion, die wirklich klobig ist, zurückkommen. Was ist das normale Muster um dies zu umgehen?Was ist der sauberste Weg, um Pass-by-Reference in Actionscript 3.0 zu simulieren?

Zum Beispiel gibt es eine saubere Möglichkeit zu implementieren swap (intA, intB) in Actionscript?

Antwort

7

Ich glaube, das Beste, was Sie tun können, ist ein Container-Objekt als Argument an eine Funktion übergeben und die Werte einiger Eigenschaften in diesem Objekt ändern:

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, Ich hoffe, dass jemand einen Trick kennt, der eleganter ist, aber es scheint wahrscheinlich, dass Ihre Antwort die beste ist. Ich schätze, die natürliche Folge ist: Macht diese Beschränkung jeden verrückt, oder ist es nur ich? :) –

+0

es treibt mich immer ein bisschen verrückt. Ich glaube nicht, dass du zu sehr alleine bist. –

-2

Wenn Actionscript wie Javascript funktioniert,

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

Sorry, aber das funktioniert nicht in ActionScript – Turambar

4

ich nehme eine Alternative würde irgendwo definieren, diese Art der Sache sein ...

public class Reference { 
    public var value:*; 
} 

Dann mit Funktionen, die eine bestimmte Anzahl von Referenz Argumente als „Zeiger“ zu handeln, wenn Sie wirklich nur für „out“ Parameter suchen und sie entweder auf dem Weg initialisieren in oder nicht, und der Swap würde:

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

und man konnte immer Nüsse gehen und spezifische IntReference definieren, StringReference usw.

3

Sie auch einen Wrapper anstelle von int verwenden:

public class Integer 
{ 
    public var value:int; 

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

natürlich ist dies nützlich mehr sein würde, wenn Sie nutzen könnten Bediener überlastet ...

4

Dies ist pingelig, aber int, String, Number und die anderen Referenz übergeben werden, es ist nur, dass sie unveränderlich sind. Natürlich ist der Effekt der gleiche wie wenn sie nach Wert übergeben wurden.

1

Es ist ärgerlich. Wenn Sie jedoch andere Idiome verwenden als z. C#, können Sie Ergebnisse von angemessener Qualität erhalten. Wenn Sie viele Parameter vor und zurück übergeben müssen, geben Sie ein Objekt mit den erforderlichen Daten ein und ändern Sie die Parameter des Objekts, wenn Sie zurückkehren. Die Objektklasse ist für genau diese Art von Sache.

Wenn Sie nur eine Reihe von Daten zurückgeben müssen, geben Sie ein Objekt zurück. Dies entspricht eher dem ECMAScript-Stil als der Pass-by-Ref-Semantik.

0

Die Destrukturierungszuweisung (z. B. [a, b] = [b, a]) ist in der Spezifikation ECMA-262 3 nicht definiert und ist nicht in JavaScript 1.5 implementiert. Dies entspricht der JScript-Implementierung in IE. Ich habe diese Syntax in der Vorschau der AS4-Spezifikationen gesehen, und ich glaube, dass sie Teil von JavaScript 1.7 ist.

2

Schauen Sie sich einfach den Java-Code an. Java hat die Konvention, dass Referenztypen als Referenz übergeben werden und primitive Typen seit dem Start als Wert übergeben werden. Es ist ein sehr gutes Modell in vielerlei Hinsicht.

Aber über Swap-Gespräche, der beste und einfachste Weg, um einen Swap in Java/AS3 zu tun ist, mit den folgenden drei Zeilen:

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

Theres nicht wirklich aus irgendeinem Grunde, eine Funktion zu verwenden, um eine einfache Swap zu tun , wenn Sie es mit nur 3 Zeilen schneller machen können.

Verwandte Themen