2013-05-16 6 views
4

저는 C#에서 Haxe NME로 코드를 변환하려고합니다. enum을 플래그로 사용합니다.Haxe - 함수에 플래그로 enum을 보냅니다.

[Flags] 
enum State 
{ 
    StateOne = 1, 
    StateTwo = 2, 
    StateThree = 4 
} 

그리고 사용은

if (someObj.HasState(State.StateOne | State.StateTwo)) 
{ 
    // Contains both the states. Do something now. 
} 

나는 Haxe NME에서이 작업을 수행하는 방법에 대한 아무 생각이 없었다.

감사합니다.

+0

최근에이 주제에 대한 블로그 포스트를 작성했습니다. Haxe로 Biwise 작업이 쉬워졌습니다. http://blog.stroep.nl/2015/08/biwise-operations-made-easy-with-haxe/ –

+0

@MarkKnol 와우, 정말 멋진 기사입니다. 내가 Haxe를 다시 사용했다면 도움이 될 것입니다. –

답변

1

나는 그것을 발견 할 수 있었다. 열거 형을 사용하는 데 문제가 있었지만 상수를 사용하여 성공했습니다. 이것은 내가 사용한 간단한 테스트 파일입니다.

package ; 

class FlagsTest 
{ 

    static inline var FLG_1:Int = 1; 
    static inline var FLG_2:Int = 2; 

    public static function main() : Void 
    { 
     var flag:Int = FLG_1; 
     if (hasFlag(flag, FLG_1)) 
     { 
      trace ("Test 1 passed"); 
     } 
     flag |= FLG_2; 
     if (hasFlag(flag, FLG_2)) 
     { 
      trace ("Test 2 passed"); 
     } 
    } 

    public static function hasFlag(flags:Int, flag:Int) : Bool 
    { 
     return ((flags & flag) == flag) ? true : false; 
    } 

} 

출력 :

FlagsTest.hx line 14: Test 1 passed 
FlagsTest.hx line 19: Test 2 passed 
+0

여기서'final'은 어디입니까, haxe는 최종 키워드가 없습니까? 오직 최종 메타 데이터 - http://haxe.org/manual/tips_and_tricks#general-metadata – simonrichardson

+0

죄송합니다, 나는 '정적 인라인'을 의미하지만 오타가 있습니다. –

11

Haxe 3에서, haxe.EnumFlags있다. 이것은 Haxe 3 Abstract Types을 사용합니다. 기본적으로 기본 유형을 감싸는 데,이 경우에는 Int와 같은 방식을 사용합니다. 그런 다음 세부적인 사항을 염려 할 필요가 없도록 예쁜 API로 마무리합니다. 여기

은 몇 가지 예제 코드입니다 :

import haxe.EnumFlags; 

class EnumFlagTest 
{ 
    static function main() 
    { 
     var flags = new EnumFlags<State>(); 
     flags.set(StateOne); 
     flags.set(StateTwo); 
     flags.set(StateThree); 
     flags.unset(StateTwo); 

     if (flags.has(StateOne)) trace ("State One active"); 
     if (flags.has(StateTwo)) trace ("State Two active"); 
     if (flags.has(StateThree)) trace ("State Three active"); 

     if (flags.has(StateOne) && flags.has(StateTwo)) trace ("One and Two both active"); 
     if (flags.has(StateOne) && flags.has(StateThree)) trace ("One and Three both active"); 
    } 
} 

enum State 
{ 
    StateOne; 
    StateTwo; 
    StateThree; 
} 

이 모든 표준 (int)로 저장되어 작품, 그리고 당신이했던 것처럼 정수 연산자를 사용하므로 외부 개체에 포장 불가 (꽤 빨리해야한다). 상자 아래에서 작동하는 방식을 보려면 EnumFlags 소스 코드를 here으로 볼 수 있습니다.

아직도 Haxe 2에 있다면, 정말 비슷한 객체를 만들 수 있습니다. 물론 객체와 정수를 생성해야합니다. 따라서 수천 (수백만?) 그 때 당신은 감속을 얻을지도 모르다. Haxe 2에서 작동해야하는 동급 코드 (체크하지는 않았지만) :

class MyEnumFlags<T:EnumValue> 
{ 
    var i:Int; 

    public function new(?i=0) 
    { 
     this.i = i; 
    } 

    public inline function has(v : T) : Bool { 
     return i & (1 << Type.enumIndex(v)) != 0; 
    } 

    public inline function set(v : T) : Void { 
     i |= 1 << Type.enumIndex(v); 
    } 

    public inline function unset(v : T) : Void { 
     i &= 0xFFFFFFF - (1 << Type.enumIndex(v)); 
    } 

    public inline static function ofInt<T:EnumValue>(i : Int) : MyEnumFlags<T> { 
     return new MyEnumFlags<T>(i); 
    } 

    public inline function toInt() : Int { 
     return i; 
    } 
} 
+0

더 쉬워 보입니다. 그러나 Haxe 2.06을 사용하려고하기 때문에 (나는 학교에서 그것을 업그레이드 할 수 없다) 나는 나의 방법을 고수 할 것이다. 응답 해 주셔서 감사합니다. 오늘 배웠다. –

+0

Haxe 2에서 똑같이 동작해야하는 코드 사본을 추가했습니다. 단, 멋진 추상 사용법이 아닌 클래스/오브젝트를 사용한다는 점을 제외하면 플래그를 많이 사용하는 경우 성능이 약간 느려질 수 있습니다. Neko 1에서는 작동하지 않을 수도 있습니다. 왜냐하면 결코 이해할 수없는 32 비트 int에 이상한 문제가 있기 때문입니다. 그러나 그것은 여전히 ​​당신에게 유용 할 것입니다. –

+0

작은 의심. 왜 i & = (Type.enumIndex (v) >> 1) 대신'i & = 0xFFFFFFF - (1 << Type.enumIndex (v)); 어떤 차이가 있습니까? –