Flex Как вызвать функцию с переменным числом параметров? - PullRequest
5 голосов
/ 04 октября 2010

Скажем, у меня есть этот класс:

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;
    }
  }
}

Как мне достичь «противоположности»? А именно, как я могу теперь ВЫЗВАТЬ «getAverage» с динамическим числом параметров?

Например, если бы я хотел что-то сделать LIKE :

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(???);

Что я хочу знать, так это то, что если у меня есть функция, которая принимает переменное число аргументов, это здорово, но как я могу ВЫЗВАТЬ ЭТО с переменным числом аргументов, если это число не известно во время выполнения? Возможно, это невозможно ... Я просто не уверен, поскольку callLater, похоже, может взять массив и каким-то образом сгенерировать из него динамическое число параметров ...

ПРИМЕЧАНИЕ: Ответы, состоящие исключительно из «Почему вы хотите это сделать?», Будут опущены.

P.S. НЕ предназначен для расчета средних значений! I РЕАЛИЗОВАН Существуют более простые способы сделать все это! (Я мог бы просто написать getAverage, чтобы принять единственный массив в качестве единственного параметра) Выше приведен просто ПРИМЕР, иллюстрирующий мой вопрос. КАК ПЕРЕЙТИ ДИНАМИЧЕСКОЕ ЧИСЛО ПАРАМЕТРОВ В ФУНКЦИЮ?

Ответы [ 5 ]

9 голосов
/ 04 октября 2010

Это то, что вы ищете?

var av:Number = getAverage.apply(null, a);
3 голосов
/ 04 октября 2010

Дейв прав.Вы можете использовать метод apply функции для передачи массива аргументов.

Вот лучшее объяснение того, как это работает и каковы аргументы применения: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/Function.html

Такжеобратите внимание, что вы можете использовать метод call, чтобы сделать то же самое, но вместо этого использовать ... args (список с разделителями-запятыми), но применять будет более подходящим для вашей ситуации.

0 голосов
/ 04 октября 2010

Flash обладает довольно сильными возможностями самоанализа. Таким образом, вместо передачи нескольких объектов, вы просто передаете один динамический объект с любым количеством необходимых вам атрибутов:

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);

Это должно охватывать практически любой случай использования, который вам может понадобиться. Недостатком является то, что это допускает некоторые довольно умные и сложные ошибки. : -)

0 голосов
/ 04 октября 2010

Вы можете создать массив или объект с этими параметрами и передать этот объект этой функции.Это просто нормально.

0 голосов
/ 04 октября 2010

Проблема с вашим вопросом состоит в том, что объект arguments уже является массивом, а использование (... args) уже предоставляет вам динамический способ передачи любого количества аргументов, которое вам требуется. Извините за предыдущий ответ, я не думал прямо ...

...