2012-09-22 3 views
1

클래스에 정적 Array 및 정적 메서드가 있으며이 메서드를 통해 배열의 일부 함수를 푸시합니다. 이 메서드는 타임 라인에서 호출되므로 프레임을 두 번 재생하면 함수가 두 번 반복됩니다.AS3 두 함수 비교

질문 : 기능이 존재하고 중복을 방지하려면 어떻게해야합니까? (addeventlistener와 비슷합니다.)

+0

어떤 기능을 말하고 있습니까? 익명? –

답변

1

짧은 버전 : 타임 라인에 코드를 지정하지 마십시오.

긴 버전 : 운이 좋으면 기능이 동일하므로 == 연산자를 사용하여 기능을 비교할 수 있습니다. 타임 라인에서 코딩 할 때 동일한 함수의 인스턴스가 여러 개있을 수 있으므로 작동하지 않습니다. 이미 추가했는지 나타내는 정적 부울을 저장할 수 있습니다.

BUT! 클래스에서 코딩을 시작하면 장기적으로 많은 문제를 해결할 수 있으며 스택 오버플로에 대한 더 나은 답변을 제공합니다. 5 성급 요리사에게 물과 쉐이크가 필요한 이유를 묻는 것과 같은 것입니다. togehter 케이크는 아주 중대하지 않았다.

+0

꽤 많이 있습니다. 타임 라인에 코드를 작성하지 마십시오. – Artless

0

ByteArray를 사용하여 개체를 비교할 수 있습니다. 귀하의 조건에 아마 함수, 인수 및 "thisObject"배열 가진 함수 호출을 밀어 것이다. 여기에 대략적인 아이디어가 있습니다. 하지만 아마도 Action Container를 기다리는 Array를 확장하는 새로운 클래스를 만들 것입니다.

package { 

    import flash.display.MovieClip; 
    import flash.utils.ByteArray; 
    import flash.events.MouseEvent; 

    public class Main extends MovieClip { 

     private static var awaiting:Array = []; 

     private function pushAction(func:Function,args:Array=null,thisArg:*=null):uint { 
      var newObj:Object = { 
       func :func, 
       args :args, 
       thisArg :thisArg 
      } 
      for (var i:int = 0; i < Main.awaiting.length; i++) { 
       if (duplicates(Main.awaiting[i],newObj)) return i; 
      } 
      return Main.awaiting.push(newObj); 
     } 

     private function nextAction(extraArgs:Array=null):* { 
      if (Main.awaiting.length == 0) return null; 
      var o:Object = Main.awaiting.shift(); 
      var args:Array = o.args; 
      if (extraArgs) args = args == null ? extraArgs : args.concat(extraArgs); 
      var thisArg:* = o.thisArg; 
      var func:Function = o.func; 
      return func.apply(thisArg,args); 
     } 

     private static function duplicates(item1:Object,item2:Object):Boolean { 
      var bArr1:ByteArray = new ByteArray(); 
      var bArr2:ByteArray = new ByteArray(); 
      bArr1.writeObject(item1); 
      bArr2.writeObject(item2); 
      bArr1.position = 0; 
      bArr2.position = 0; 
      var str1:String = bArr1.readUTFBytes(bArr1.length); 
      var str2:String = bArr2.readUTFBytes(bArr2.length); 
      return str1 == str2; 
     } 

     public function Main() { 
      pushAction(function(){trace('the first item')}); 
      pushAction(traceMe,['the second item']); 
      pushAction(traceMe,['the third item']); 
      pushAction(sayHi,null,Main); 
      pushAction(function(){trace('the first item')}); 
      pushAction(traceMe,['the second item']); 
      pushAction(traceMe,['the third item']); 
      pushAction(sayHi,null,Main); 
      stage.addEventListener(MouseEvent.CLICK,clicked); 
     } 

     private function clicked(e:MouseEvent):void { 
      this.nextAction(); 
     } 

     public function traceMe(str:String):void { 
      trace(str); 
     } 

     private static function sayHi():void { 
      trace('hi'); 
     } 

    } 

} 
0

짧은 버전 :

var i = arr.indexOf(myFunc); 
if(i != -1) arr.push(myFunc); 

긴 버전 :

나는 타임 라인에 전문가가 아니다. 순수 AS3에는 정적 함수의 인스턴스가 하나 뿐이라는 것을 알고 있습니다. 타임 라인을 사용할 때 똑같은 것 같아요.

그래서 당신이 할 수있는 가장 빠른 것은 단지

arrayName.indexOf (funcname에)를 사용한다;

이 함수는 배열에 함수가 없으면 -1을 반환하고 그렇지 않으면 올바른 인덱스를 반환합니다.

이것이 작동하지 않으면 Google에 알려주세요. 매우 궁금합니다.

0

함수는 동적 유형이지만 일반적으로 컴파일러는 함수에 임의의 속성을 만들 수 없지만 형식 검사를 "속임수"로 사용하면 나중에 함수를 식별하는 데 사용할 수있는 속성을 가질 수 있습니다 이 방법은 함수가 똑같은 함수 일 필요는 없습니다.

이것은 매우 비참한 일입니다. :)하지만 퀴즈 지식만큼이나 나중에 도움이 될 수 있습니다.

function foo():void { /* some code */ } 
function bar():void { /* some code */ } 
foo["baz"] = bar["baz"] = 42; 

if (foo["baz"] && foo["baz"] == bar["baz"]) trace("equal"); 
else trace("distinct");