Domanda

Qualche idea su come restituire più variabili da una funzione in ActionScript 3?

Qualcosa come VB.NET in cui è possibile modificare la variabile dell'argomento di input (argomenti 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

Qualunque cosa a parte che restituisce un array associativo ?

return {a:"string 1", b:"string 2"}
È stato utile?

Soluzione

Tutto in AS3 è un riferimento a parte [u] ints. Per generalizzare, tutto ciò che eredita Object verrà dato alla funzione da un riferimento.

Detto questo, l'unico modo in cui credo tu possa farlo è usare una classe contenitore come un Array o un String (" 5 " e fare la conversione + matematica).

Altri suggerimenti

Citando una fonte su Google:

  

In ActionScript 3.0, tutti gli argomenti vengono passati per riferimento poiché tutti i valori vengono archiviati come oggetti. Tuttavia, gli oggetti che appartengono ai tipi di dati primitivi, che includono Boolean, Number, int, uint e String, hanno operatori speciali che li fanno comportare come se fossero passati per valore.

Che mi ha portato a cercare la fonte canonica

Sembra che stringhe, ints, unità, booleani siano passati per valore. Ho provato questo piccolo frammento in Flash e i risultati sono stati negativi:

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

var b:String = "old";

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

Quindi ... String è anche un tipo di dati nella lista nera? Anche booleano? Intendo qual è un modo sicuro di dire quali tipi vengono passati per riferimento?

È tutto per valore, se capisci la programmazione in C avrai familiarità con il concetto di puntatori.

Pensa a un puntatore che punta a qualcosa in memoria, e tutti i nomi delle variabili " bob from (bob = new person ();) " Sono essenzialmente dei puntatori con cui lavori.

Ora, quando dichiari una funzione, dato che sono tutti per valore

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

Puoi pensare sia a " a " e " b " essendo nuovi puntatori, quindi solo all'interno di " Test " funzione esegue entrambe le operazioni " a " e " b " esiste e indica qualcosa in memoria.

Quindi usiamolo

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

Quindi i puntatori s1 e s2 punteranno SEMPRE su " null " e "un nuovo Sprite in memoria" rispettivamente, a meno che non vengano modificati come s1 e s2 all'interno del loro "Scope" < - Assicurati di comprendere l'ambito variabile prima ancora di provare ad affrontarlo.

E all'interno della funzione ora abbiamo due nuovi puntatori " a " puntando a " null " e " b " indicando "lo stesso sprite in memoria di s2". quindi Poiché oggetti e matrici sono essenzialmente raccolte di puntatori e solo due nuovi puntatori sono stati creati dalla funzione per l'uso di "a" e " b " eventuali proprietà / variabili esposte "puntatori ai dati in memoria" di " a " o " b " sarà sempre lo stesso di quelli per " s1 " e "s2" e sono esattamente gli stessi puntatori.

Quindi all'interno della funzione quando " a " viene impostato su "b", in realtà tutto ciò che accade è il "a" il puntatore ora punta alla stessa cosa di " b " ;. Ma "s1" e "s2" indicano ancora ciò a cui puntavano prima.

!!!! Se questo fosse per riferimento, non saresti in grado di pensare a " a " e " b " come nuovi puntatori, sarebbero effettivamente "s1" e "s2" stessi, tranne per il fatto che li scrivi come " a " e " b " ;.

Wrong Wrong Wrong and Wrong .. ogni argomento viene passato per valore !!! il fatto che è possibile modificare una proprietà all'interno dell'oggetto passato non significa che è possibile modificare l'oggetto stesso. prova il seguente codice

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

ed ecco il risultato della traccia:

null
[object Sprite]

Nota la sottile differenza tra l'esempio di DarthZorG e questo dai documenti di 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

Punto essendo: Non puoi cambiare ciò a cui punta il riferimento ma puoi cambiare i dati a cui punta il riferimento, purché quel riferimento sia un Oggetto / Matrice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top