0

ここで明らかに何かが欠けています。

配列から動的 AS3 クラスのメソッドを埋める必要があります (以下のばかげた例を参照)。

しかし、これらのメソッドを呼び出すと、それらはすべて同じメソッドのように見えます。以下の例では、すべてのメソッドがfoobar1.

ループなしで手動でメソッドを作成すれば、すべて問題ありません。

手がかりはありますか?

  package foo
  {
    public class Bar
    {
      public function testDynamicClassSanity():void
      {
        var foo:Foo = new Foo();
        var methods:Object = { foobar1: 101, foobar2: 201, foobar3: 301 };

        for (var key:String in methods)
        {
          var val:Number = methods[key];
          foo[key] = function():Number
          {
            return val;
          };
        }

        // Next trace prints
        // 101 = 101 201 = 101 301 = 101
        trace(
            101, "=", foo.foobar1(),
            201, "=", foo.foobar2(),
            301, "=", foo.foobar3()
          );
      }
    }
  }

  internal dynamic class Foo
  {
  };
4

3 に答える 3

4

問題はのスコープにあると思いvalます-スコープはforループであると想定しますが、AS3の場合はそうではなく、スコープは関数です。すべての通話が301を返すというのは正しいですか?

更新:発生している問題(変数valが参照され、関数に「コピー」されるのではなく後で解決される)を回避するのは非常に面倒なので、ユースケースによっては、メソッド呼び出しを調べて、Proxyが提供する機能を使用して、テーブルに望ましい結果をもたらします。

于 2009-09-10T21:47:27.327 に答える
2

あなたの問題はvar変数のスコープだと思います。この変更を試してください:

for (var key:String in methods)
{
  var val:Number = methods[key];
  foo[key] = function (valInternal:Number) {
    return function():Number
    {
        return valInternal;
    };
  }(val);
}

(上記のトリックはJavascriptで機能し、同様の問題を回避します... AS3に適用できると思います)

于 2009-09-10T21:56:47.410 に答える
1

testDynamicClassSanity()記録のために、関数の修正版をここに投稿します。

    public function testDynamicClassSanity():void
    {
      var foo:Foo = new Foo();
      var methods:Object = { foobar1: 101, foobar2: 201, foobar3: 301 };

      // We have to introduce new scope
      var makeCallback:Function = function(result:Number):Function
      {
        return function():Number
        {
          return result;
        }
      }

      for (var key:String in methods)
      {
        foo[key] = makeCallback(methods[key])
      }

      // Prints as intended
      // 101 = 101 201 = 201 301 = 301
      trace(
          101, "=", foo.foobar1(),
          201, "=", foo.foobar2(),
          301, "=", foo.foobar3()
        );
     }
于 2009-09-10T22:01:52.187 に答える