gpt4 book ai didi

haxe - hax 中的前向运算符

转载 作者:行者123 更新时间:2023-12-05 00:13:50 27 4
gpt4 key购买 nike

我正在尝试使用一些附加功能编写自己的 bool “抽象”。

@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 不会转发像“!”这样的基本 bool 运算符:
var f:T = false;
if(!f) { // fails here, because "!" is not defined as an operator for MyBool ...
trace("2");
}

错误消息是“MyBool 应该是 Bool”,我觉得这很奇怪,因为 MyBool 是带有 @:forward 注释的 Bool 的抽象,并且有一个 @:to-method。

当然,也有一些简单的解决方法。一个人可以使用:
if(!f.toBool()) {
trace("2");
}

和/或在摘要中添加一个用 @:op(!A) 注释的函数:
@:op(!A)
public inline function notOp():Bool {
return !this;
}

但是我不喜欢这两种方法:
  • 我不喜欢将 @:op(...) 添加到 MyBool,因为为每个可能的运算符创建一个方法需要很多代码(可能不是 bool 值,但例如使用 Int、Float 等)。
  • 我不喜欢使用 !var.toBool()。如果有人已经写了相当多的代码(她)他不想经历所有这些,当(她)只是想将 Bool 更改为 MyBool ......我的意思是当然(她)他也可以施放 Bool每当添加新代码时到 MyBool,但这也可能很可怕。

  • 所以我想知道是否有人有更好的主意?也许还有另一个“@:forward”之类的编译元数据,我还不知道?

    最佳答案

    有一个关于此的开放功能请求:

    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;

    关于haxe - hax 中的前向运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48129014/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com