在 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;
请注意 addCombined
、dispatchCombined
和 combine
如何期望 "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.
我似乎无法让它工作,但如果它在 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;
请注意 addCombined
、dispatchCombined
和 combine
如何期望 "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.