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

big*_*igp 0 string enums haxe parameter-passing

我似乎无法使其正常工作,但如果在 Haxe 中无法实现,我会感到惊讶。

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

例子:

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

    super.kill();
}
Run Code Online (Sandbox Code Playgroud)

在我的 Messages.hx 类中:

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;
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*nol 5

我认为您需要EnumValue作为参数类型(如果它仅用于枚举值),并使用Std.String转换为 String 值。

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

当然,可以使用字符串插值将其写得更小:

static inline function combine(a:EnumValue, b:EnumValue):String {
    return '$a:$b';
}
Run Code Online (Sandbox Code Playgroud)

当然,使用类型参数可以“更加动态” :

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

完全没有必要按照建议使用 Dynamic。如果您使用 Dynamic,您基本上会关闭类型系统

现场示例:http :
//try.haxe.org/#a8844