2008-12-02 14 views
5

¿Alguna idea de cómo devolver variables múltiples desde una función en ActionScript 3?¿Puede tener argumentos "ByRef" en las funciones AS3?

Cualquier cosa como VB.NET donde puede tener variable de argumento de entrada modificado (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 

Cualquier cosa aparte de devolver un array asociativo ?

return {a:"string 1", b:"string 2"} 

Respuesta

3

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

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

6

Parece que Strings, ints, units, Booleans se pasan por Value. puerta de este pequeño fragmento de código 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 

Así que ... es un cadena de datos de la lista negra tipo también? Boolean también? Me refiero a ¿cuál es una forma segura de decir qué tipos se pasan por referencia?

+0

Este es mi problema también. Deseo enviar la variable real (b en este ejemplo) a mi función y obtener el cambio de eso por función.http: //stackoverflow.com/questions/13188723/pass-actual-variable-object-to-a-function –

+1

Para que quede claro, el tipo de objeto es irrelevante, porque este tema se refiere a una convención de llamadas. "ByRef (una palabra clave de Visual Basic): especifica que un argumento se pasa de tal manera que el procedimiento llamado puede cambiar el valor de una variable subyacente al argumento en el código de llamada". AS3 no es compatible con eso; siempre pasa argumentos "ByVal". La asignación de un nuevo objeto a un parámetro dentro de una función no hará que la variable pasada al parámetro de esa función apunte al nuevo objeto. El objeto en sí mismo generalmente se puede modificar, pero la variable pasada no se puede modificar dentro del func. – Triynko

15

Citando una fuente Googled:

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 canonical source.

+0

¡Gracias! Gran respuesta: estaba buscando esta información por años. –

+0

¿Qué pasa con la pregunta "¿Alguna idea de cómo devolver variables múltiples desde una función en ActionScript 3"? – bzlm

2

Wrong Wrong Wrong and Wrong ... cada argumento se pasa por valor !!! el hecho de que puede cambiar una propiedad dentro del objeto pasado no significa que pueda cambiar el objeto en sí. tratar 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 de rastreo:

null 
[object Sprite] 
+2

Falso. Las matrices y los objetos se pasan por referencia. Aprende tus básicos. –

+3

+1 Tienes básicamente razón. La clave es que las referencias se pasan por valor como muestra su ejemplo. Los documentos indican que los objetos se pasan por referencia, creo, para evitar una mayor confusión; pero esa explicación ingenua termina finalmente fracasando; la mayoría de los programadores de AS que conozco parecen repetir el canto y, por lo tanto, no podrían entender lo que está sucediendo en tu ejemplo: muchas personas también lo hacen en Java y .NET; En la mayoría de las circunstancias, sin embargo, esto no es un gran problema. –

0

Nota la diferencia sutil entre el ejemplo de DarthZorG y éste a partir 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 que se encuentre: No puede cambiar a lo que apunta la referencia, pero puede cambiar los datos a los que apunta la referencia, siempre que ference es un Object/Array.

2

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

Piensa en un puntero como apuntando a algo en la memoria, y todos los nombres de variables "bob from (bob = new person();)" son básicamente punteros con los que trabajas.

Ahora, cuando se declara una función, ya que todos ellos son Por valor

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

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

Así que vamos a utilizar es

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

Así que el S1 y punteros s2 siempre apuntará a "nulo" y "una nueva Sprite en la memoria", respectivamente, a menos que sean modificadas como S1 y S2 dentro de su "Alcance "< - Asegúrate de comprender el alcance de la variable incluso 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 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.

Por lo tanto, dentro de la función cuando "a" se configura como "b", realmente todo lo que sucede 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 fuera por referencia, no sería capaz de pensar en "a" y "b" como nuevos punteros, en realidad serían "s1" y "s2", a menos que los escriba como "a" y "b" ".

Cuestiones relacionadas