haxe中的前向运营商

时间:2018-01-06 15:48:51

标签: haxe

我正在尝试用一些额外的函数编写自己的布尔“抽象”。

@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;
}

但是我不喜欢这两种方法:

  • 我不喜欢将@:op(...)添加到MyBool,因为为每个可能的运算符创建一个方法需要很多代码(也许不是用布尔值,但是例如使用Int,Float,......)。 / LI>
  • 我不喜欢使用!var.toBool()。如果某人已经编写了相当多的代码,他不想全部通过这些代码,那么当他只是想将Bool改为MyBool时...我的意思是他当然也可以施放Bool每当添加新代码时到MyBool,但这也可能很糟糕。

所以我想知道是否有人有更好的主意?可能还有另一个“@:forward”式编译元数据,我还不知道吗?

2 个答案:

答案 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手册中记录)来完全避免这个问题。此方法将消除操作员转发的需要。