2008-09-08 9 views

Respuesta

7

Creo que lo mejor que puede hacer es pasar un objeto contenedor como un argumento a una función y cambiar los valores de algunas 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); 
+1

hasseg, espero que alguien sepa un truco que es más elegante, pero parece probable que su respuesta sea la mejor. Supongo que el seguimiento natural es: ¿Esta limitación vuelve loco a alguien más o solo soy yo? :) –

+0

me vuelve un poco loco de vez en cuando. No creo que estés demasiado solo en eso. –

-2

Si ActionScript funciona como Javascript,

[a,b] = [b,a] 
+0

Lo sentimos, pero eso no funciona en ActionScript – Turambar

4

supongo alternativa estaría en alguna parte que define este tipo de cosas ...

public class Reference { 
    public var value:*; 
} 

A continuación, utilice las funciones que toman un número de argumentos de referencia para actuar como "punteros" si realmente sólo en busca de parámetros "fuera" y, o bien inicializarlas sobre la manera de entrar o no, y su intercambio se convertiría en:

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 IntReference específica, StringReference, etc.

3

también es posible usar una envoltura 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 se pudiera utilizar sobrecarga del operador ...

4

Esto se acaba aburriendo, pero int, String, Number y los otros se pasan por referencia, es sólo que son inmutables. Por supuesto, el efecto es el mismo que si se pasaran por valor.

1

Es molesto. Pero si usa diferentes idiomas que en, por ejemplo, C#, puede obtener resultados de calidad razonable. Si necesita pasar una gran cantidad de parámetros hacia adelante y hacia atrás, pase un objeto con los datos necesarios y cambie los parámetros del objeto cuando regrese. La clase Object es solo para este tipo de cosas.

Si solo tiene que devolver una serie de datos, devuelva un Objeto. Esto está más en consonancia con el estilo ECMAScript que la semántica de paso por error.

0

La asignación de desestructuración (por ejemplo [a, b] = [b, a]) no está definida en la especificación ECMA-262 3, y no está implementada en JavaScript 1.5, que es la versión equivalente a la implementación de JScript en ES DECIR. Sin embargo, he visto esta sintaxis en la vista previa de las especificaciones AS4, y creo que es parte de JavaScript 1.7.

2

Basta con mirar algunos códigos Java. Java ha tenido la convención de que los tipos de referencia se pasan por referencia y los tipos primitivos pasan por valor desde su inicio. Es un muy buen modelo en muchos sentidos.

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

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

Theres no es realmente ninguna razón para utilizar una función para hacer un simple canje , cuando puedes hacerlo más rápido con solo 3 líneas.

Cuestiones relacionadas