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;
}
}
최근에이 주제에 대한 블로그 포스트를 작성했습니다. Haxe로 Biwise 작업이 쉬워졌습니다. http://blog.stroep.nl/2015/08/biwise-operations-made-easy-with-haxe/ –
@MarkKnol 와우, 정말 멋진 기사입니다. 내가 Haxe를 다시 사용했다면 도움이 될 것입니다. –