在Haxe中迭代enum摘要

Jas*_*ges 2 enums enumeration haxe

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

例:

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

对于枚举实例,这可以完成,例如:

enum ExampleEnum {
    Value1;
    Value2;
    Value3;
}

for(value in Type.allEnums(ExampleEnum))
    trace(value);
}
Run Code Online (Sandbox Code Playgroud)

不确定这是否是最好的方法 - 我可以获得钥匙; 但是,我无法获得价值,如:

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

for (key in keys) {
    trace(key + " = " + ExampleEnumAbstract[key]);
}
Run Code Online (Sandbox Code Playgroud)

试图以这种方式获取值会产生编译时错误:

字符串应该是Int
Array不允许访问Class<ExampleEnumAbstract.ExampleEnumAbstract_Impl_>

最终,一map对关键值对将是理想的.

str*_*ium 5

据我所知,没有规范.枚举摘要有点hackish,通常只用于绑定和低级优化.我怀疑有可能期望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,
    ];
}
Run Code Online (Sandbox Code Playgroud)

您还可以为您生成一个宏来生成此(或类似)函数.

回到你的ExampleEnumAbstract[key]代码:当然它不会工作.您可以通过使用它来使其工作Reflect.field,但不保证值甚至存在于运行时.