ventajas - ¿Cuál es la forma más limpia de simular pass-by-reference en Actionscript 3.0?
codigos actionscript 3.0 para flash (8)
Actionscript 3.0 (y supongo que Javascript y ECMAScript en general) carece de referencias pasadas para tipos nativos como ints. Como resultado, encuentro que recuperar valores de una función es realmente torpe. ¿Cuál es el patrón normal para evitar esto?
Por ejemplo, ¿hay una forma clara de implementar swap (intA, intB) en Actionscript?
Creo que lo mejor que puedes hacer es pasar un objeto contenedor como argumento a una función y cambiar los valores de algunas propiedades en 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);
Si ActionScript funciona como Javascript,
[a,b] = [b,a]
Esto es quisquilloso, pero int
, String
, Number
y los demás se pasan por referencia, es solo que son inmutables. Por supuesto, el efecto es el mismo que si se pasaran por valor.
Supongo que una alternativa sería definir este tipo de cosas ...
public class Reference {
public var value:*;
}
Luego use funciones que toman una cantidad de argumentos de referencia para actuar como "indicadores" si realmente solo está buscando parámetros de "salida" y los inicializa en el camino de entrada 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 puedes volverte loco y definir IntReference, StringReference, etc.
También podría usar 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 pudieras usar la sobrecarga del operador ...
Esto es molesto. Pero si usa diferentes expresiones idiomáticas que, 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 necesita devolver un conjunto de datos, devuelva un Objeto. Esto está más en consonancia con el estilo ECMAScript que la semántica de paso por error.
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 IE. Sin embargo, he visto esta sintaxis en la vista previa de las especificaciones AS4, y creo que es parte de JavaScript 1.7.
Solo mira un código 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 hablando de swap, la mejor y más fácil forma de hacer un swap en Java / AS3 es con las siguientes tres líneas:
var temp:int = array[i]; array[j] = array[i]; array[i] = temp;
En realidad no hay ninguna razón para usar una función para hacer un simple intercambio, cuando puedes hacerlo más rápido con solo 3 líneas.