Сравните enum, не рассматривая его аргументы

Позвольте мне прояснить это, у меня есть это перечисление:

enum Token {
    Number(v:Float);
    Identifier(v:String);
    TString(v:String);
    Var;
    Assign;
    Division;
    // and so on
}

Я хочу проверить, является ли значение переменной идентификатором, но это не работает:

if(tk == Token.Identifier) {

Это позволяет мне сравнивать значения только в том случае, если я передаю аргументы:

if(tk == Token.Identifier('test')) {

Но это будет соответствовать только в том случае, если идентификатор «тест», но я хочу сопоставить любой идентификатор.


person Community    schedule 22.09.2010    source источник


Ответы (3)


Type.enumConstructor(tk) == "Identifier"

Прочтите документ по типу, чтобы узнать больше о методах перечисления.


Обновление (2019-02-04):

На момент написания этого ответа это был Haxe 2.06. С тех пор многое изменилось.

На данный момент для Haxe 3 (или 4) я бы рекомендовал сопоставление шаблонов, в частности используя проверку по одному шаблону:

if (tk.match(Identifier(_)) ...

что является короткой рукой для

if (switch tk { case Identifier(_): true; case _: false; }) ...

_ — это подстановочный знак, который соответствует чему угодно.

person Andy Li    schedule 22.09.2010

альтернативно:

static function isIdentifier(token : Token) return switch(token) { case Token.Identifier(_): true; default: false; }

Используя «using», вы также должны уметь:

if(tk.isIdentifier()) {
person Franco Ponticelli    schedule 22.09.2010

Или даже:

tk.match(Token.Identifier(_));
person azrafe7    schedule 04.12.2015