클래스에 정적 Array 및 정적 메서드가 있으며이 메서드를 통해 배열의 일부 함수를 푸시합니다. 이 메서드는 타임 라인에서 호출되므로 프레임을 두 번 재생하면 함수가 두 번 반복됩니다.AS3 두 함수 비교
질문 : 기능이 존재하고 중복을 방지하려면 어떻게해야합니까? (addeventlistener와 비슷합니다.)
클래스에 정적 Array 및 정적 메서드가 있으며이 메서드를 통해 배열의 일부 함수를 푸시합니다. 이 메서드는 타임 라인에서 호출되므로 프레임을 두 번 재생하면 함수가 두 번 반복됩니다.AS3 두 함수 비교
질문 : 기능이 존재하고 중복을 방지하려면 어떻게해야합니까? (addeventlistener와 비슷합니다.)
짧은 버전 : 타임 라인에 코드를 지정하지 마십시오.
긴 버전 : 운이 좋으면 기능이 동일하므로 ==
연산자를 사용하여 기능을 비교할 수 있습니다. 타임 라인에서 코딩 할 때 동일한 함수의 인스턴스가 여러 개있을 수 있으므로 작동하지 않습니다. 이미 추가했는지 나타내는 정적 부울을 저장할 수 있습니다.
BUT! 클래스에서 코딩을 시작하면 장기적으로 많은 문제를 해결할 수 있으며 스택 오버플로에 대한 더 나은 답변을 제공합니다. 5 성급 요리사에게 물과 쉐이크가 필요한 이유를 묻는 것과 같은 것입니다. togehter 케이크는 아주 중대하지 않았다.
꽤 많이 있습니다. 타임 라인에 코드를 작성하지 마십시오. – Artless
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');
}
}
}
짧은 버전 :
var i = arr.indexOf(myFunc);
if(i != -1) arr.push(myFunc);
긴 버전 :
나는 타임 라인에 전문가가 아니다. 순수 AS3에는 정적 함수의 인스턴스가 하나 뿐이라는 것을 알고 있습니다. 타임 라인을 사용할 때 똑같은 것 같아요.
그래서 당신이 할 수있는 가장 빠른 것은 단지
arrayName.indexOf (funcname에)를 사용한다;
이 함수는 배열에 함수가 없으면 -1을 반환하고 그렇지 않으면 올바른 인덱스를 반환합니다.
이것이 작동하지 않으면 Google에 알려주세요. 매우 궁금합니다.
함수는 동적 유형이지만 일반적으로 컴파일러는 함수에 임의의 속성을 만들 수 없지만 형식 검사를 "속임수"로 사용하면 나중에 함수를 식별하는 데 사용할 수있는 속성을 가질 수 있습니다 이 방법은 함수가 똑같은 함수 일 필요는 없습니다.
이것은 매우 비참한 일입니다. :)하지만 퀴즈 지식만큼이나 나중에 도움이 될 수 있습니다.
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");
어떤 기능을 말하고 있습니까? 익명? –