Frage

Jede Idee, wie zu Rückgabe mehrerer Variablen von einer Funktion in ActionScript 3?

So etwas wie VB.NET wo können Sie die input-argument die variable modifiziert (ByRef arguments)?

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

Alles abgesehen von Rückkehr assoziatives array?

return {a:"string 1", b:"string 2"}
War es hilfreich?

Lösung

Alles in AS3 ist eine Referenz abgesehen von [u]int.Zu verallgemeinern, dass alles erbt Object wird die Funktion durch Referenz.

Dass gesagt wird, der einzige Weg, ich glaube, Sie können es tun, ist die Verwendung einer container-Klasse wie ein Array oder String ("5" und führen Sie die Konvertierung+math.).

Andere Tipps

Zitieren eines gegoogelt Quelle:

In ActionScript 3.0 ist, werden alle Argumente per Referenz übergeben, weil alle Werte gespeichert werden, als Objekte.Allerdings, Objekte und gehören zu den primitiven Datentypen gehören Boolean, Number, int, uint, String, spezielle Operatoren, die machen Sie sich Verhalten, als wären Sie durch einen Wert übergeben.

Das führte mich zu suchen, bis die kanonische Quelle.

Es scheint, dass Strings, ints, Einheiten, Boolean als Wert übergeben werden. Ich habe versucht, diese kleinen Schnipsel in Flash, und die Ergebnisse waren negativ:

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

var b:String = "old";

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

So...String ist einer Blacklist Daten zu geben?Boolesche auch?Ich meine was ist ein sicherer Weg, zu sagen, die Typen per Referenz übergeben?

Es ist alles von Wert, wenn Sie verstehen, C-Programmierung werden Sie vertraut mit dem Konzept von Zeigern.

Denken Sie über einen Zeiger als Hinweis auf etwas in Erinnerung, und alle Variablennamen "von bob (bob = new person();)" Sind im wesentlichen Zeiger, mit dem Sie arbeiten.

Nun, wenn Sie deklarieren eine Funktion, denn Sie sind alle Durch den Wert

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

Sie können denken über die beiden "a" und "b" als neuer Zeiger, so nur in der "Test" - Funktion tun, die beiden "a" und "b" vorhanden ist, und zeigen Sie etwas im Speicher.

Also lasst uns es verwenden

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

Also den s1-und s2-Zeiger IMMER auf "null" und "eine neue Sprites in den Speicher" beziehungsweise, es sei denn, Sie werden geändert, als s1 und s2 in Ihren "Rahmen" <- Bitte stellen Sie sicher, dass Sie verstehen, Geltungsbereich von Variablen, bevor Sie sogar versuchen, um diese Situation zu bewältigen.

Und innerhalb der Funktion haben wir nun zwei neue Zeiger "a" zeigt auf "null" und "b" - zeigen auf die gleiche sprite im Speicher s2".so, Da Objekte und arrays sind im wesentlichen Sammlungen von Zeigern und nur zwei neue Zeiger wurden erstellt, indem die Funktion für den Gebrauch von "a" und "b" - Eigenschaften/Variablen ausgesetzt "Zeiger auf Daten im Speicher" von "a" oder "b" wird immer noch genau die gleichen wie diejenigen für die "s1" und "s2" und sind exakt die gleichen Zeiger.

Also innerhalb der Funktion, wenn "ein" festgelegt wird, werden "b", wirklich alles, was passiert ist, die "ein" Zeiger verweist nun auf die gleiche wie "b".Aber "s1" und "s2" immer noch zeigen Sie auf, was Sie waren, zeigen auf, bevor.

!!!!Wenn war dies eine Referenz, die Sie nicht in der Lage wäre, zu denken, von "a" und "b" als neuer Zeiger, Sie sei eigentlich "s1" und "s2" für sich selbst, außer du schreibst wie "a" und "b".

Falsch, Falsch, Falsch und Falsch..jedes Argument wird als Wert übergeben!!!die Tatsache, dass Sie können ändern Sie eine Eigenschaft in einem Objekt übergeben, bedeutet nicht, Sie können ändern Sie das Objekt selbst.versuchen Sie den folgenden code

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);
}

und hier ist die trace-Ergebnis :

null
[object Sprite]

Beachten Sie den subtilen Unterschied zwischen DarthZorG Beispiel dieses hier von der Flash-docs:

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

Punkt:Sie können nicht ändern, was die Referenz verweist aber Sie können Sie ändern die Daten, die die Referenz verweist, so lange diese Referenz ist ein Objekt/Array.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top