2010-10-04 17 views
5

Digamos que tienen esta clase:Flex ¿Cómo llamar a una función con un número variable de parámetros?

package{ 
    import flash.display.Sprite; 
    public class Main extends Sprite{ 
    public function Main(){ 
     trace(getAverage(1,2,3)); 
     trace(getAverage(1,2,3,4)); 
     trace(getAverage(1,2,3,4,5)); 
    } 
    public function getAverage (...numbers) { 
     var total = 0; 
     for (var i = 0; i < numbers.length; i++) { 
     total += numbers [i]; 
     } 
     return total/numbers.length; 
    } 
    } 
} 

¿Cómo lograr el "frente" de este? A saber, ¿cómo podría LLAMAR ahora "getAverage" con un número dinámico de paramétricos?

Por ejemplo, si quería hacer algo COMO:

var r:int=Math.random()*6; 
var a:Array=new Array(); 
for (i:int=0;i<r;i++) { 
    a[i]=Math.random()*22; 
} 
// Now I have 'r' Number Of Parameters Stored In 'a' 
// How Do I Call getAverage, with all the values in 'a'?? 
// getAverage(a) isn't right, is it? 
// I'm looking for something similar to getAverage(a[0],a[1],a[...]); 

var av:Number=getAverage(???); 

Lo que yo quiero saber, es si tengo una función que toma un número variable de argumentos, eso es genial, pero ¿cómo puede ¿LO LLAMO con una cantidad variable de argumentos, cuando ese número no se conoce en tiempo de ejecución? Posiblemente sea imposible ... No estoy seguro, ya que 'callLater' parece ser capaz de tomar una matriz y generar un número dinámico de parámetros de alguna manera ...

NOTA: Respuestas que consisten únicamente en "¿Por qué quieres hacer esto?", Será downvoted.

P.S. ¡Este NO ES para calcular promedios! I REALICE ¡Hay maneras más sencillas de hacer todo esto! (Podría escribir getAverage para aceptar una sola matriz como su único parámetro) The Above es solo un EJEMPLO para ilustrar mi pregunta. ¿CÓMO PASAR UN NÚMERO DINÁMICO DE PARÁMETROS A UNA FUNCIÓN?

+0

¿Cambiar la función para aceptar una matriz en su lugar? – Cameron

+0

¿Cómo me ayuda esto a pasar una cantidad dinámica de parámetros? Eso requeriría cambiar el prototipo de la función getAverage, que frustra todo el propósito de mi pregunta. Me doy cuenta de que puedo pasar una matriz. La próxima vez lea la pregunta por favor antes de comentar. – Joshua

+0

Su primer ejemplo parece responder a lo que desea a medida que pasa una cantidad dinámica de parámetros a una función.Eso es exactamente para lo que es el parámetro de descanso. http://www.sephiroth.it/weblog/archives/2006/06/actionscript_3_rest_parameter.php – Allan

Respuesta

9

¿Esto es lo que estás buscando?

var av:Number = getAverage.apply(null, a); 
0

El problema con su pregunta es que los argumentos objeto ya está usando una matriz y (... args) ya se le proporciona una forma dinámica para pasar cualquier número de argumentos que se requieren. Perdón por la respuesta anterior, no estaba pensando correctamente ...

0

Puede crear una matriz o un objeto con esos parámetros y pasar ese objeto a esa función. Eso es normal.

0

Flash tiene una capacidad de introspección bastante fuerte. Así, en lugar de pasar una serie de objetos, que acaba de pasar un objeto dinámico individual con cualquier número de atributos que necesita:

var ob:Object={arg1:"value1", arg2:8}; 
var arg:String="arg4"; 
ob["arg3"]=8; 
ob[arg]=18; 
trace (ob.hasOwnProperty("arg1")); 
trace (ob.arg3); 
trace (ob.arg4); 

Eso debería cubrir casi cualquier caso de uso que pueda necesitar. El inconveniente es que esto permite algunos errores bastante inteligentes y difíciles de rastrear. :-)

3

Dave es correcto. Puede usar el método apply de una función para pasar en una matriz de argumentos.

Aquí es una mejor explicación de cómo funciona y cuáles son los argumentos de aplicar son: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/Function.html

También tenga en cuenta que puede utilizar el método de llamada a hacer lo mismo pero utilizando ... args (comas lista delimitada) en su lugar, pero aplicar sería más adecuado para su situación.

Cuestiones relacionadas