Puoi avere argomenti "ByRef" nelle funzioni AS3?
-
22-07-2019 - |
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"}
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.