В AS3, как бы я передать содержимое объекта в качестве аргументов для функции? - PullRequest
2 голосов
/ 31 января 2012

Например, у меня есть функция:

function doSomething( a:String, b:Number, c:Array ):void {
  trace( a + b + c.toString() );
}

… и у меня есть объект, который имеет все элементы, которые я хотел бы передать аргументы:

var args:Object = { 'dog', 11, myArray };

… и яхочу иметь возможность передавать содержимое аргументов в doSomething без внесения каких-либо изменений в doSomething (предположим, что это чужая функция), и я хотел бы сделать это так, чтобы не предполагать, что я что-то знаю о содержимом аргументов.

Возможно ли это?

Ответы [ 4 ]

5 голосов
/ 31 января 2012

Вы разработчик Python?;)

Вы должны превратить ваши args: Object в args: Array и затем вызвать doSomething.apply (this, argsArray).Проблема здесь в том, что ваши аргументы в аргументах: Object не упорядочены, и, таким образом, их циклический цикл превращает их в массив для передачи в apply (), что не приведет к предсказуемой последовательности аргументов.

Если толькоу вас есть стратегия для обеспечения правильного порядка свойств при преобразовании объекта в массив, это звучит как неохота.

2 голосов
/ 15 февраля 2012

То, что вы хотите использовать, это Function.apply () . Для этого вам нужно изменить объект args из вашего примера на Array.

Тогда вы бы построили объекты вроде:

var myObject:Object = { command: doSomething, args: [ "dog", 11, myArray ] };

Где command - ссылка на вызываемую функцию, а args - список аргументов, необходимых для command. Затем для вызова doSomething:

myObject.command.apply(this, myObject.args)

В качестве дополнительного бонуса это будет работать с любой функцией с любым количеством аргументов, все, что вам нужно сделать, это изменить значения для command и args в myObject. Таким образом, вы можете передать список объектов, которые соответствуют этим правилам, и перебрать их без необходимости изменения какого-либо кода.

0 голосов
/ 31 января 2012

РЕДАКТИРОВАТЬ: Верно, я добавил еще один метод, который может принимать любое количество аргументов в любой форме.По сути, он даст вам массив параметров для обработки.

private var _testObject:Object;

private function init():void{
    _testObject = {str:"test", num:11, arr:["test","array"]};
    doSomething(_testObject.str, _testObject.num, _testObject.arr);
}

private function doSomething(...args):void{
    trace(args.toString());
}

Конечно, это должно быть внутри класса или тега скрипта, но если вы вызываете метод init, вы должны увидеть следующую трассировку:test, 11, test, array

Надеюсь, это поможет.

0 голосов
/ 31 января 2012

Вы должны передать значения вашего объекта как

var args:Object = { a:'dog', b:11, c:myArray };
function doSomething( args.a, args.b, args.c );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...