【问题标题】:Check equaling enum without parameter检查不带参数的相等枚举
【发布时间】:2020-08-08 11:04:22
【问题描述】:

我使用枚举,但找不到检查 eqauling 的好方法。

enum Turn {
    A(value:Int);
    B(value:Int);
}
class Test {
    static function main() {
        var turn = Turn.A(100);
        //I want to Check turn is Turn.A(any value) without using 'switch'.
        if (turn == Turn.A) ...
    }
}

有什么好的简单的检查方法吗?

【问题讨论】:

    标签: haxe


    【解决方案1】:

    您可以使用.match() function:

    if (turn.match(Turn.A(_)))
    

    【讨论】:

      【解决方案2】:

      我没有对此进行测试,但使用 Type 类可能会更快:

      if (Type.enumConstructor(turn) == "A") ...
      

      因为它不安全(“A”可能是错字),我建议使用 ExprTools:

      import haxe.macro.ExprTools.*;
      if (Type.enumConstructor(turn) == toString(macro A)) ...
      

      还有另一种方法,但我不认为它更快:

      if (Type.enumIndex(turn) == Type.enumIndex(A(0))) ...
      

      你可能会得到不同枚举的条件评估为真:

      enum Color { Red; }
      if (Type.enumIndex(turn) == Type.enumIndex(Red)) ... // true
      

      【讨论】:

      • 使用反射而不是正确键入的代码似乎是个糟糕的主意...如果有什么较慢.match() 被优化为简单的整数比较:try.haxe.org/#90CE2 - if(Test.turn[1] == 0)
      • Type != 反射,例如不使用动态,EnumValue->String是函数签名
      • API 文档不同意你的观点,Type 被认为是反射:i.imgur.com/11z2XWY.png 另外,你自己已经指出了各种类型安全问题。 ;)
      • 那很糟糕。例如,enumConstructor 可以简单地返回 arrayOfConstructorNames[enumIndex(enum)]。我不再喜欢 Haxe 的原因之一(只是访问)。不过,希望它可以帮助新人更好地了解 Haxe
      猜你喜欢
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多