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)
请注意如何addCombined,dispatchCombined并combine期望“枚举”类型,但在这种情况下,我不确定 Haxe 是否真的期望传递整个 Enum“类”(即:ListMessages代替ListMessages.KILLED),或者值是否应该起作用。无论如何,编译器不喜欢它 - 所以我假设必须使用另一种特殊类型。
还有另一种方法可以传递枚举并将它们解析为字符串吗?
我认为您需要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