Pregunta

¿Alguna idea de cómo devolver múltiples variables de una función en ActionScript 3?

¿Algo así como VB.NET donde puede modificar la variable del argumento de entrada (argumentos 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

¿Algo aparte de devolver una matriz asociativa ?

return {a:"string 1", b:"string 2"}
¿Fue útil?

Solución

Todo en AS3 es una referencia aparte de [u] ints. Para generalizar, todo lo que hereda Object se le dará a la función mediante una referencia.

Dicho esto, la única forma en que creo que puedes hacerlo es usar una clase de contenedor como un Array o un String (" 5 " y hacer la conversión + matemáticas).

Otros consejos

Citando una fuente en Google:

  

En ActionScript 3.0, todos los argumentos se pasan por referencia porque todos los valores se almacenan como objetos. Sin embargo, los objetos que pertenecen a los tipos de datos primitivos, que incluyen Boolean, Number, int, uint y String, tienen operadores especiales que los hacen comportarse como si fueran pasados ??por valor.

Lo que me llevó a buscar la fuente canónica .

Parece que las cadenas, ints, unidades, booleanos se pasan por valor. Probé este pequeño fragmento en Flash y los resultados fueron negativos:

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

var b:String = "old";

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

Entonces ... ¿String también es un tipo de datos en la lista negra? Booleano también? Me refiero a ¿cuál es una forma segura de saber qué tipos se pasan por referencia?

Todo es por valor, si entiendes la programación en C estarás familiarizado con el concepto de punteros.

Piense en un puntero que apunta a algo en la memoria, y todos los nombres de variables '' bob from (bob = new person ();) '' Son esencialmente punteros con los que trabaja.

Ahora, cuando declaras una función, ya que todas son Por valor

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

Puedes pensar en ambos " a " y "b" siendo nuevos punteros, por lo que solo dentro de la "Prueba" función hacer ambas " a " y "b" existir y señalar algo en la memoria.

Así que usémoslo

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

Entonces, los punteros s1 y s2 SIEMPRE apuntarán a "nulo" y "un nuevo Sprite en memoria" respectivamente, a menos que se modifiquen como s1 y s2 dentro de su "Alcance" < - Asegúrese de comprender el alcance variable antes de intentar abordarlo.

Y dentro de la función ahora tenemos dos nuevos punteros " a " apuntando a "nulo" y "b" apuntando a "el mismo sprite en memoria que s2". Por lo tanto, dado que los objetos y las matrices son esencialmente colecciones de punteros y la función ha creado solo dos punteros nuevos para usar " a " y "b" cualesquiera propiedades / variables expuestas '' punteros a datos en memoria '' de " a " o '' b '' seguirá siendo exactamente el mismo que para '' s1 '' y "s2" y son exactamente los mismos punteros.

Entonces dentro de la función cuando " a " se configura para ser '' b '', realmente todo lo que sucede es la '' a '' el puntero ahora apunta a lo mismo que "b". Pero " s1 " y "s2" todavía apuntan a lo que señalaban antes.

!!!! Si esto fuera por referencia, no podría pensar en " a " y "b" como nuevos punteros, en realidad serían '' s1 '' y "s2" ellos mismos, excepto que los escribes como " a " y " b " ;.

Incorrecto Incorrecto Incorrecto e incorrecto ... ¡cada argumento se pasa por valor! El hecho de que pueda cambiar una propiedad dentro del objeto pasado no significa que pueda cambiar el objeto en sí. prueba el siguiente código

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

y aquí está el resultado del seguimiento:

null
[object Sprite]

Tenga en cuenta la sutil diferencia entre el ejemplo de DarthZorG y este de los documentos de 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 de ser: No puede cambiar a qué apunta la referencia, pero puede cambiar los datos a los que apunta la referencia, siempre que esa referencia sea un objeto / matriz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top