AS3比较两个功能

时间:2012-09-22 12:47:51

标签: actionscript-3 function compare

我的类中有静态数组和静态方法,通过这个方法我可以在数组中推送一些函数。该方法在时间轴上调用,因此当我播放两次帧时,它将推动该函数两次,依此类推。

问题: 如何检查功能是否存在并防止重复? (就像addeventlistener一样)

4 个答案:

答案 0 :(得分:1)

简短版本:不要在时间轴上编码。

长版本:如果您很幸运,功能将相同,因此可以使用==运算符对它们进行比较。但是当你在时间轴上编码时,可能会有几个相同功能的实例,所以这不起作用。您可以保存一个静态布尔值,指示您是否已添加它。

BUT!在课堂上开始编码,从长远来看,它将为您节省很多麻烦,并在Stack Overflow上为您提供更好的答案 - 这有点像向五星级厨师询问为什么您只需添加水和摇动 - togehter-cake的结果并不是很好。

答案 1 :(得分: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');
        }

    }

}

答案 2 :(得分:0)

简短版本:

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

长版:

我不是时间轴上的专家。我知道在纯AS3中只有一个静态函数实例,我想在使用时间轴时它是一样的。

所以你能做的最快的事就是使用

  

arrayName.indexOf(了funcName);

如果函数在数组中不存在则返回-1,否则返回正确的索引。

如果这不起作用,请告诉我们,我很好奇。

答案 3 :(得分: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");