2012-09-22 112 views
1

我在我的類中有一個靜態數組和一個靜態方法,並通過此方法推送數組中的一些函數。該方法在時間線上調用,所以當我播放該幀兩次時,它將推動該功能兩次,等等。AS3比較兩個函數

問題: 如何檢查函數是否存在並防止重複? (很喜歡的addEventListener)

+0

你在說什麼功能?匿名? –

回答

1

短版:不時間軸上的代碼。

長版:如果你是幸運的功能是相同的,因此它可能使用==運營商對它們進行比較。但是當你在時間線上編碼時,可能會有幾個相同功能的實例,所以這是行不通的。你可以保存一個靜態布爾值,指出你是否已經添加了它。

但是!開始在類中編碼,從長遠來看它將爲您節省很多麻煩,並且在堆棧溢出時給您更好的答案 - 這就像詢問一位五星級廚師爲什麼您​​唯一的 - 添加水和震動 - togehter-cake沒有變得非常好。

+0

非常多。切勿在時間線上編寫代碼。 – Artless

0

您可以使用ByteArray的比較對象。對於你的條件,我可能會推動函數調用與函數,參數和「thisObject」的數組。這是一個粗略的想法。但我可能會創建一個新的類來擴展該等待操作容器的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,否則返回正確的索引。

如果這不起作用,讓我們知道了,我很好奇。

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");