无法重载我的课程的逻辑运算符(或)

gmo*_*kin 15 operator-overloading perl6

我试图重载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); 
Run Code Online (Sandbox Code Playgroud)

我期望将其works!(1, 2)作为输出获取,但我会获取A.new(a => 1),这是标准or运算符的结果。

其他运算符(and和除外xor)似乎对我有用:

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); 
Run Code Online (Sandbox Code Playgroud)

结果works!(1, 2)

我是不是做错了什么或有只是没有办法超载的标准orandxor运营商?

Jon*_*ton 15

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

逻辑运算符,如andor&&,和||,被指定为仅评估它们的第二操作数取决于它们的第一操作数的感实性,因此不能被编译成子程序调用。

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