gpt4 book ai didi

operator-overloading - 不能为我的类(class)重载逻辑运算符(或、和)

转载 作者:行者123 更新时间:2023-12-03 20:40:48 27 4
gpt4 key购买 nike

我试图重载逻辑 or自定义类的运算符,但它似乎不起作用。这就是我所做的:

class A { has $.a }
multi sub infix:<or> (A $a, A $b) {
"works!({$a.a}, {$b.a})"
}
say A.new(:1a) or A.new(:2a);

我期待得到 works!(1, 2)作为输出,但我得到 A.new(a => 1) ,这是标准 or 的结果运算符(operator)。

其他运算符( andxor 除外)似乎对我有用:
class A { has $.a }
multi sub infix:<anything-else> (A $a, A $b) {
"works!({$a.a}, {$b.a})"
}
say A.new(:1a) anything-else A.new(:2a);

结果 works!(1, 2) .

我是做错了什么还是没有办法重载标准 or , and , xor运营商?

最佳答案

只有编译成子例程调用的运算符才可以重载。由于子例程调用在进行调用之前对其参数进行了评估,因此那些需要对其操作数之一进行延迟评估的运算符在编译器中被处理为特殊形式。

逻辑运算符,如 and , or , && , 和 || , 被指定为仅根据其第一个操作数的真实性评估其第二个操作数,因此不能编译为子例程调用。

即使它们要编译成对第二个操作数进行重击的子例程调用,在第二个参数的类型上仍然不可能进行问题中所写的多次调度,因为这些运算符的语义意味着我们无法评估它马上,但这反过来意味着我们找不到它的类型来进行调度。

关于operator-overloading - 不能为我的类(class)重载逻辑运算符(或、和),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56941167/

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