我正在编写一个比较函数,当这些字段存在于两个对象中时,我需要检查特定于类的字段的值。当然,Haxe的编译时检查会抛出错误,因为接口不包含该字段。
我已经尝试包装检查字段('a'..'z'
和 when you do ('a' - 'a') you get 0
'b' - 'a' = 1
...
'z' - 'a' = 25
)的代码以及安全转换:
Std.is(record, MX)
编译器似乎没有注意到。我提出的最佳解决方法是将其传递给具有动态类型的便捷函数。
答案 0 :(得分:3)
推荐的方法是使用Std.instance
,其中会调用Std.is
和cast
:
var result = super.compare(record);
var sub = Std.instance(record, MX); // returns either record:MX or null
if (result == 0 && sub != null)
result = compareNumber(this.prio, sub.prio);
return result;
由于Std.instance
首先检查是否可以进行强制转换,因此可以使用更快速的不安全强制转换。该实施很容易遵循:JS,C++。
关于您问题的示例的说明:它不起作用的原因是cast(record, MX)
本身不会更改该声明后的类型(它们可能会更改record
的推断类型如果它是单形,但我不认为在这种情况下允许安全演员表)。转换是表达式,就像Haxe中的其他所有内容一样,并且为了使它们有用,您需要将它们的结果分配给某个变量(就像您在答案中所做的那样,但明确键入变量是可选的)。
答案 1 :(得分:0)
将变量分配给更严格类型的自身似乎解决了这个问题:
public function compare(record:InterfaceName):Int{
var result = super.compare(record); //checks of all common fields which also happens to determine type
if(result == 0){
try{
var record:MX = cast(record, MX);
return compareNumber(this.prio, record.prio);
} catch(error:Dynamic){
//do nothing
}
}
return result;
}
但是,safe cast和type check上的文档不包含此步骤(尽管类型检查条目实际上没有示例),我怀疑有更好的解决方案。< / p>