在 Haxe 中,如何在函数中传递枚举值,然后在函数中将它们转换为字符串?

In Haxe, how do you pass Enum values in functions, and then convert them to Strings within the function?

我似乎无法让它工作,但如果它在 Haxe 中不可能,我会感到惊讶。

我正在尝试将游戏中定义的几个枚举值传递给一个函数,以便它可以将它们连接为 String 类型并将其传递给其他函数。

示例:

// In a general Entity class:
public override function kill():Void {
    messages.dispatchCombined(entityType, ListMessages.KILLED);

    super.kill();
}

在我的 Messages.hx class:

package common;

import msignal.Signal.Signal1;

/**
 * A Message / Event class using Signals bound to String names.
 * @author Pierre Chamberlain
 */
class Messages{
    var _messages:MessagesDef;

    public function new() {
        _messages = new MessagesDef();
    }

    public function add(pType:String, pCallback:FuncDef) {
        if (_messages[pType] == null) {
            _messages[pType] = new Signal1<Dynamic>();
        }

        var signals = _messages[pType];
        signals.add( pCallback );
    }

    public function dispatch(pType:String, pArg:Dynamic):Bool {
        var signals = _messages[pType];
        if (signals == null) return false;
        signals.dispatch(pArg);
        return true;
    }

    //Compiler doesn't like passing enums :(
    public inline function addCombined(pSource:Enum, pEvent:Enum, pCallback:FuncDef) {
        add( combine(pSource, pEvent), pCallback );
    }

    public inline function dispatchCombined(pSource:Enum, pEvent:Enum, pArg:Dynamic):Bool {
        return dispatch( combine(pSource, pEvent), pArg);
    }

    //How can I just pass the enum "names" as strings?
    static inline function combine(a:Enum, b:Enum):String {
        return String(a) + ":" + String(b);
    }
}


typedef MessagesDef = Map<String, Signal1<Dynamic>>;
typedef FuncDef = Dynamic->Void;

请注意 addCombineddispatchCombinedcombine 如何期望 "Enum" 类型,但在这种情况下,我不确定 Haxe 是否真的期望整个 Enum "class" 被传递(即:ListMessages 而不是 ListMessages.KILLED)或者一个值是否应该起作用。无论如何,编译器不喜欢它 - 所以我假设必须使用另一种特殊类型。

还有其他方法可以传递枚举并将它们解析为字符串吗?

使用 Dynamic 而不是 Enum 或立即将它们作为 String 传递,因为如果您以后需要它,您总是可以从 String 转换为 enum。

无论如何将枚举作为 enum:Dynamic 传递,然后调用 Std.string(enum);

编辑:使用 EnumValue 绝对是比 Dynamic 更好的方法,我在这些函数中使用 Dynamic,因为我发送的不仅仅是 Enums,在那种情况下我不担心类型安全。

我认为您需要 EnumValue as parameter type (if it is only for enum values), and use Std.String 才能转换为字符串值。

static inline function combine(a:EnumValue, b:EnumValue):String {
    return Std.string(a) + ":" + Std.string(b);
}

当然可以使用String interpolation写得更小:

static inline function combine(a:EnumValue, b:EnumValue):String {
    return '$a:$b';
}

当然可以 'more dynamic' 使用 type parameters:

static inline function combine<A, B>(a:A, b:B):String {
    return '$a:$b';
}

完全没有必要按建议使用Dynamic。如果你使用 Dynamic,你基本上 turn off the type system.

实例:
http://try.haxe.org/#a8844