6

残りの演算子を使用してさまざまな数のパラメーターを受け入れることができる関数があります。

オブジェクトを作成せず、初期化関数を呼び出し、配列全体を渡さずに、rest演算子で収集された引数をコンストラクターに直接渡すオブジェクトを作成したいのですが、パラメーターはapply()関数で行います。

出来ますか ?applyの使用は機能しません。

public function myFunc(...arg) {

     // something link "new MyClass.apply(args)"
     return new MyClass();

}
4

4 に答える 4

14

残念だけど違う。コンストラクターに対してapplyを機能させる方法はありません。一般的に行われることは、引数の数に基づいて呼び出しの数を準備することです:

public function myFunc(...arg):Myclass {
  switch (arg.length) {
    case 0:return new MyClass();
    case 1:return new MyClass(arg[0]);
    case 2:return new MyClass(arg[0], arg[1]);

    //... etc

    case n:return new MyClass(arg[0], arg[1],..,arg[n]);
    default: throw new Error("too much arguments in myFunc");
  }
}
于 2010-10-06T18:14:33.417 に答える
2

さて、これは私を興味深い長い研究に導きました!

AS2 eval()を模倣するためのutilsで満たされたこのきちんとしたSWCファイルを見つけました:http: //www.riaone.com/products/deval/index.html

そして、これがあなたが探しているものが実際に機能するかもしれないという概念実証です:

package tests {
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.utils.getQualifiedClassName;
    import r1.deval.D;

    public class RandomTests extends Sprite{

        public function RandomTests() {
            super();

            var test:BitmapData =   create(BitmapData, 100, 100, true, 0x00000000);
            trace(test);
        }


        public function create( pClass:Class, ... pArgs ):* {
            D.importClass(pClass);
            var fullQName:String =  getQualifiedClassName(pClass);
            var qNameSplit:Array =  fullQName.split("::");
            var className:String =  qNameSplit[1];
            fullQName =             qNameSplit.join(".");

            var statements:String =
            "import $0;\n" +
            "return new $1($2);";


            var args:Array =        [];
            for (var a:int = 0, aLen:int = pArgs.length; a < aLen; a++) {
                switch(pArgs[a].constructor) {
                    case String:
                        args[a] =   "\"" + pArgs[a] + "\"";
                        break;
                    default:
                        args[a] =   pArgs[a];
                        break;
                        //throw new Error("Unhandled type, please add it: " + pArgs[a].constructor);
                }
            }

            return D.eval(XString.gsub(statements,[fullQName, className, args.join(",")]));
        }
    }

}

依存関係のビットについては申し訳ありませんが(簡単なサブ置換のための私のXStringクラスのように)、理論的には機能します。唯一の問題は、オブジェクト参照を引数エントリとして渡すことです。しかし、もう一度...r1.deval.Dクラスがそれを取ることができるかもしれません...うーん。

とにかく、これは共有する価値があるのではないかと思いました。

于 2010-10-14T19:15:30.760 に答える
0

私も答えを探していますが、答えがわからないのは残念です。

これが私の現在の(あまり良くない)この種のことをする方法です、あなたの何人かが興味を持ってくれることを願っています:

// Foo.as
public class Foo {
    // construct
    public function Foo(... args):void {
        create.apply(this, args);
    }

    // this function do as a really construct function, tricky stuff
    function create(id:uint, name:String) {
        trace(id, name);
    }
}

// Bar.as
// for create this kind of class, just new it as usual
...
var foo:Foo = new Foo(123, "abc");
...
于 2011-11-03T04:29:34.433 に答える
0

まあこれもあります

public function myFunc(args:Object) {

   //then access various argumens
   return new MyClass(args.name, args.id, args.active)

}

そしてそれを呼び出しますmyFunc({id:33,name:'jo')

次に、オブジェクトを渡すことができますか、それともこれはあなたが探しているものから遠すぎますか?

于 2010-10-06T19:05:10.260 に答える