Сравнете enum, без да отчитате аргументите му

Нека изясня това, имам това 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')) {

Но това ще съвпадне само ако идентификаторът е „test“, но искам да съвпадна с всеки идентификатор.


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


Отговори (3)


Type.enumConstructor(tk) == "Identifier"

Прочетете документа за тип за повече методи за enum.


Актуализация (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; }

Използвайки "използване", вие също трябва да можете да правите:

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

Или дори:

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