2009-09-10 4 views
0

분명히 여기에 뭔가가 빠져 있습니다.AS3 동적 클래스 동적 메서드 이름

배열에서 동적 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

나는이 문제를 추측 할이 val의 범위 지정에 - 당신은 그 범위가 루프의 가정,하지만 그 AS3의 경우가 아니라, 범위는 기능입니다. 모든 전화가 301을 반환하는 것이 맞습니까?

업데이트 : 발생하는 문제를 해결할 때 (변수 val이 참조되고 나중에 함수로 복사되는 대신 해결되는 경우) 매우 유 용합니다. 사용 사례에 따라 메서드 호출을 검사 할 수 있습니다 Proxy에서 제공하는 기능을 사용하여 테이블에서 원하는 결과를 찾아보십시오.

+0

네, 맞습니다 (거의 101입니다). 질문을 업데이트했습니다. 이 문제를 해결하려면 어떻게해야합니까? –

+1

아, 나는 for 루프가 정의 된 순서대로 객체의 속성을 반복 할 것이라고 가정하고있었습니다. 물론 이것은 어리석은 가정입니다 .-)이 다른 질문을 확인하십시오. http://stackoverflow.com/questions/422784/ 문제 해결 방법 - 3-as3을위한 팁. –

2

당신의 문제는 var 변수의 유효 범위라고 생각합니다. 이 수정 시도 :

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

나는 수정 된 버전 여기에 게시합니다, 기록을 위해

+0

"return valInternal"이어야한다고 생각합니다. 맞습니까? –

+0

예, 고정 ..... – jsight

1

(위의 트릭이 자바 스크립트에서 작동이 비슷한 문제를 해결하기를 ... 나는 AS3에 적용 내기) 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() 
     ); 
    }