actionscript-3 byref args

actionscript 3 - ¿Puedes tener argumentos "ByRef" en las funciones AS3?



actionscript-3 args (6)

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

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

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

¿Algo como VB.NET donde puedes 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"}


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 se pasaran por valor.

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


Parece que Strings, ints, units, Booleans pasan por Value. Intenté 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? Boolean también? Quiero decir, ¿cuál es una forma segura de decir qué tipos se pasan por referencia?


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

Ser puntual: no puede cambiar a lo que apunta la referencia, pero puede cambiar los datos a los que apunta la referencia, siempre que esa referencia sea un objeto / matriz.


Todo vale, si entiendes la programación C, estarás familiarizado con el concepto de punteros.

Piense en un puntero como que señala algo en la memoria, y todos los nombres de variables "bob from (bob = new person ();)" son básicamente 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; }

Puede pensar que tanto "a" como "b" son punteros nuevos, por lo tanto, solo dentro de la función "Prueba" existen tanto "a" como "b" y apuntan a algo en la memoria.

Así que vamos a usarlo

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 incluso antes de tratar de abordar esta.

Y dentro de la función ahora tenemos dos nuevos punteros "a" apuntando a "nulo" y "b" apuntando a "el mismo sprite en memoria como s2". Dado que los objetos y las matrices son esencialmente colecciones de punteros y solo se han creado dos punteros nuevos para la función "a" y "b" cualquier propiedad / variable expuesta "punteros a datos en la memoria" de "a" o "b" seguirá siendo exactamente igual a los de "s1" y "s2" y son exactamente los mismos punteros.

Entonces, dentro de la función cuando "a" se configura como "b", realmente todo lo que ocurre es que el puntero "a" ahora apunta a lo mismo que "b". Pero "s1" y "s2" aún apuntan a lo que señalaban antes.

!!!! Si esto fuera por referencia, no sería posible pensar en "a" y "b" como nuevos punteros, en realidad serían "s1" y "s2", a menos que los escriba como "a" y "b" .


Wrong Wrong Wrong Wrong and Wrong. ¡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]