在Haxe中迭代enum摘要

时间:2014-12-20 11:05:39

标签: 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.allEnums(ExampleEnum))
    trace(value);
}

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

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

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

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

  

字符串应为Int
  Class<ExampleEnumAbstract.ExampleEnumAbstract_Impl_>

不允许访问数组

最终,map个键值对将是理想的。

1 个答案:

答案 0 :(得分: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,
    ];
}

你也可以为你创建一个宏来生成这个(或类似的)函数。

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