2014-12-20 2 views
2

Как можно перечислить теги рефератов для получения списка пар значений ключа?Iterate enum abstracts in Haxe

Пример:

@:enum 
abstract ExampleEnumAbstract(UInt) { 
    public var value1 = 0x0; 
    public var value2 = 0x1; 
    public var value3 = 0x2; 
} 

Для экземпляров перечислений, это может быть достигнуто, например, как:

enum ExampleEnum { 
    Value1; 
    Value2; 
    Value3; 
} 

for(value in Type.allEnums(ExampleEnum)) 
    trace(value); 
} 

Не уверен, что это лучший подход - я могу получить ключи; Однако, я не смог получить значения, как в:

var keys:Array<String> = Type.getClassFields(ExampleEnumAbstract) 

for (key in keys) { 
    trace(key + " = " + ExampleEnumAbstract[key]); 
} 

Попытка получить значение таким образом дает компиляции ошибки времени:

String should be Int
Array access is not allowed on Class<ExampleEnumAbstract.ExampleEnumAbstract_Impl_>

В конечном счете map ключевых пар значений будет идеальным.

ответ

5

Насколько я знаю, на этом нет спецификации. Рефераты Enum немного хаки и обычно используются только для привязок и оптимизации низкого уровня. Я сомневаюсь, что можно будет ожидать, что rtti будет работать с ними в ближайшем будущем и на всех платформах (кстати, это касается всех рефератов).

Таким образом, лучший фактический подход был бы просто

@:enum abstract ExampleEnumAbstract(UInt) { 
    public var value1 = 0x0; 
    public var value2 = 0x1; 
    public var value3 = 0x2; 
    public static function getConstructorsValues():Map<String, UInt> return [ 
     'value1' => 0, 
     'value2' => 1, 
     'value3' => 2, 
    ]; 
} 

Вы также можете сделать макрос генерации этого (или аналогичный) функцию для вас.

Возвращение к вашему ExampleEnumAbstract[key] Код: конечно, он не будет работать. Вы можете заставить его работать с помощью Reflect.field, однако не гарантируется значения, даже есть во время выполнения.

0

Что заставляет вас думать, что вы можете использовать доступ к массиву на Class?

Если вам нужны эти расширенные функции перечисления, такие как Type.allEnums(), я бы посоветовал использовать абстрактное перечисление - особенно если это только для аннотаций UInt, перечисления уже проиндексированы.

Вы можете использовать макрос для создания карты всех значений. Flixel делает это in a couple of places.

+0

Лучшим примером Int Enum было бы [Haxe документация по рефератам Enum] (http://haxe.org/manual/types-abstract-enum.html), ссылаясь на коды HttpStatus. Оператор квадратной скобки на классе был просто примером. –