我正在尝试用一些额外的函数编写自己的布尔“抽象”。
@forward
abstract MyBool(Bool) {
public inline function new(b:Bool) {
this = b;
}
@:from
public static inline function fromBool(b:Bool):MyBool {
return new MyBool(b);
}
@:to
public inline function toBool():Bool {
return this;
}
// some additional functions
}
原则上这很好用:
var t:T = true;
if(t) {
trace("1");
}
t.someStrangeMethod();
但是@:forward不会转发像“!”这样的基本布尔运算符:
var f:T = false;
if(!f) { // fails here, because "!" is not defined as an operator for MyBool ...
trace("2");
}
错误信息是“MyBool应该是Bool”,我觉得很奇怪,因为MyBool是一个Bool的摘要,带有@:forward annotation 和有一个@:to-method。< / p>
当然有一些简单的解决方法。人们可以使用:
if(!f.toBool()) {
trace("2");
}
和/或将一个用@:op(!A)注释的函数添加到抽象:
@:op(!A)
public inline function notOp():Bool {
return !this;
}
但是我不喜欢这两种方法:
所以我想知道是否有人有更好的主意?可能还有另一个“@:forward”式编译元数据,我还不知道吗?
答案 0 :(得分:4)
有一个关于此的公开功能请求:
Can @:forward also forward underlying operator overloads? (#5035)
使代码示例有效的一种方法是允许使用to Bool
进行隐式转换。我不完全确定为什么等效@:to
函数在这里不起作用,因为Haxe手册指出"Class field casts have the same semantics"。
abstract MyBool(Bool) to Bool {
除此之外,我认为唯一的选择是为每个要支持的运营商声明@:op
功能。如果声明没有正文,则会转发基础类型的运算符:
@:op(!A) function notOp():MyBool;
答案 1 :(得分:2)
如果您的主要目标是仅向<div ng-view>
<div
class="ldBar label-center"
style="width:50%;height:50%;margin:auto"
data-value="35"
data-preset="circle"
></div>
</div>
类型添加方法,那么可以通过创建一个通过静态扩展向Bool添加方法的类(在Haxe手册中记录)来完全避免这个问题。此方法将消除操作员转发的需要。