我试图为自定义类重载逻辑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运算符的结果。

其他运算符(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)

我是在做错什么,还是没有办法重载标准的orandxor运算符?

最佳答案

只有编译为子例程调用的运算符可能会过载。由于子例程调用的参数在调用之前先经过评估,因此那些需要延迟对其操作数之一求值的运算符在编译器中以特殊形式处理。

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

即使将它们编译成对第二个操作数进行重整的子例程调用,也无法对第二个参数的类型进行问题中所写的多次调度,因为这些运算符的语义意味着我们无法对其进行求值立即,但这又意味着我们无法找到其类型来进行调度。

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

10-12 21:47
查看更多