¿Cuál es la forma más limpia para simular el paso por referencia de Actionscript 3.0?

StackOverflow https://stackoverflow.com/questions/49107

  •  09-06-2019
  •  | 
  •  

Pregunta

Actionscript 3.0 (y supongo Javascript y ECMAScript en general) carece de paso por referencia de tipos nativos como enteros.Como resultado me estoy encontrando obtención de los valores de una función realmente torpe.¿Cuál es el patrón normal para evitar esto?

Por ejemplo, hay una manera correcta para implementar swap( intA, intB ) en Actionscript?

¿Fue útil?

Solución

Yo Creo que lo mejor que puedes hacer es pasar de un contenedor de objeto como argumento a una función y cambiar los valores de algunas de las propiedades de ese objeto:

function swapAB(aValuesContainer:Object):void
{
    if (!(aValuesContainer.hasOwnProperty("a") && aValuesContainer.hasOwnProperty("b")))
        throw new ArgumentError("aValuesContainer must have properties a and b");

    var tempValue:int = aValuesContainer["a"];
    aValuesContainer["a"] = aValuesContainer["b"];
    aValuesContainer["b"] = tempValue;
}
var ints:Object = {a:13, b:25};
swapAB(ints);

Otros consejos

Supongo que una alternativa sería en algún lugar de la definición de este tipo de cosas ...

public class Reference {
    public var value:*;
}

A continuación, utilice las funciones que tener un número de Referencia argumentos para actuar como "punteros" si usted realmente está buscando "fuera de parámetros" y cualquiera de los inicializar en el camino o no y el intercambio sería:

function swap(Reference a, Reference b) {
    var tmp:* = a.value;
    a.value = b.value;
    b.value = tmp;
}

Y siempre se puede volver loco y definir los IntReference, StringReference, etc.

Esta es una molestia, pero int, String, Number y los demás son se pasa por referencia, es solo que ellos son inmutables.Por supuesto, el efecto es el mismo como si fueran pasados por valor.

Usted podría también utilizar un contenedor en lugar de int:

public class Integer
{
    public var value:int;

    public function Integer(value:int)
    {
        this.value = value;
    }
}

Por supuesto, esto sería más útil si usted podría utilizar la sobrecarga de operadores...

Basta con mirar algunas código Java.Java ha tenido la convención de que los tipos de referencia se pasa por referencia y los tipos primitivos se pasan por valor desde su creación.Es un muy buen modelo de muchas maneras.

Pero hablando de swap, el mejor y más fácil manera de hacer un swap en Java/AS3 es con las tres líneas siguientes:

var temp:int = array[i];
array[j] = array[i];
array[i] = temp;

No hay realmente ninguna razón para usar una función para hacer un simple intercambio, cuando puede hacerlo más rápido con sólo 3 líneas.

Es molesto.Pero si el uso de modismos diferentes que en, por ejemplo,C#, usted puede conseguir razonable-la calidad de los resultados.Si usted necesita para pasar un montón de parámetros de ida y vuelta, pasar un objeto lleno con los datos necesarios, y cambiar los parámetros del objeto cuando regrese.La clase de Objeto es justo para este tipo de cosas.

Si usted sólo tiene que devolver un montón de datos, devolver un Objeto.Esto es más acorde con el ECMAScript estilo de pass-by-ref semántica.

Desestructuración de la asignación (por ejemplo,[a,b] = [b,a]) no está definido en el ECMA-262 3 especificación, y que no esta implementada en JavaScript 1.5, que es la versión equivalente a la JScript aplicación en el IE.He visto esta sintaxis en la AS4 especificaciones de vista previa, sin embargo, y creo que es parte de JavaScript 1.7.

Si el código ActionScript funciona como Javascript,

[a,b] = [b,a]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top