Enums 在Haxe中迭代枚举摘要

Enums 在Haxe中迭代枚举摘要,enums,enumeration,haxe,Enums,Enumeration,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

如何迭代枚举摘要以获得键值对列表

例如:

@: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]);
}
var键:Array=Type.getClassFields(ExampleEnumAbstract)
用于(输入键){
跟踪(key+“=”+ExampleEnumAbstract[key]);
}
尝试以这种方式获取值会导致编译时错误:

字符串应为Int
不允许在
类上访问数组


最终,键值对的
映射将是理想的。

据我所知,这方面没有规范。枚举摘要有点粗俗,通常仅用于绑定和低级优化。我怀疑在不久的将来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,
    ];
}
@:enum抽象示例EnumAbstract(UInt){
公共风险值1=0x0;
公共风险值2=0x1;
公共风险值3=0x2;
公共静态函数getConstructorsValues():映射返回[
“值1”=>0,
“值2”=>1,
“值3”=>2,
];
}
您还可以制作一个宏来生成此(或类似)函数

回到你的
ExampleEnumAbstract[key]
code:当然不行了。您可以使用
Reflect.field
使其正常工作,但不能保证这些值在运行时存在