Аргументы AS3 - PullRequest
       15

Аргументы AS3

2 голосов
/ 10 июня 2009

Как вы думаете, почему код ниже не работает? Что бы вы изменили / добавили, чтобы это работало?

Любая помощь приветствуется ..

function TraceIt(message:String, num:int)
{
    trace(message, num);
}

function aa(f:Function, ...args):void
{
    bb(f, args);
}

aa(TraceIt, "test", 1);

var func:Function = null;
var argum:Array = null;

function bb(f:Function, ...args):void
{
    func = f;
    argum = args;
    exec();
}

function exec()
{
    func.apply(null, argum);
}

Я получаю ArgumentError (Ошибка # 1063):

Argument count mismatch on test_fla::MainTimeline/TraceIt(). Expected 2, got 1.

.. Итак, переданный параметр (argum) не может предоставить все переданные аргументы ..

.. Пожалуйста, сохраните структуру функции (трафик) без изменений. Мне нужно решение, использующее те же функции в том же порядке. Я должен передать аргументы переменной и использовать их в методе exec () выше. .

С уважением

Ответы [ 3 ]

7 голосов
/ 10 июня 2009

Хорошо, вот решение .. после того, как сломал мне голову:)

    function TraceIt(message:String, num:int)
    {
        trace(message, num);
    }

    function aa(f:Function=null, ...args):void
    {
        var newArgs:Array = args as Array;
        newArgs.unshift(f);
        bb.apply(null, newArgs);
    }

    aa(TraceIt, "test", 1);

    var func:Function = null;
    var argum:*;

    function bb(f:Function=null, ...args):void
    {
        func = f;
        argum = args as Array;
        exec();
    }

    function exec():void
    {
        if (func == null) { return; }
        func.apply(this, argum);
    }

Таким образом, вы можете передавать аргументы в качестве переменных другой функции и выполнять их ..

Спасибо всем, кто нашел время, чтобы помочь ...

1 голос
/ 10 июня 2009

Измените свою функцию bb, чтобы она выглядела следующим образом:

function bb(f:Function, args:Array):void
{
    func = f;
    argum = args;
    exec();
}

Как теперь, он принимает переменное количество аргументов, но вы передаете массив (из аргументов) из aa.

1 голос
/ 10 июня 2009

Когда в конечном итоге вызывается TraceIt (), он вызывается с параметром 1 Array, а не с параметрами String и int.

Вы можете изменить TraceIt () на:

function TraceIt(args:Array)
{
     trace(args[0], args[1]);
}

Или вы можете изменить exec () на:

function exec()
{
     func.apply(null, argum[0].toString().split(","));
}

... как вы видите, когда проходите «test», 1, вы получаете массив с первым значением «test, 1». Однако это решение не работает за тривиальным случаем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...