【问题标题】:Cannot overload logical operators (or, and) for my class不能为我的班级重载逻辑运算符(或,和)
【发布时间】:2019-07-08 19:07:54
【问题描述】:

我试图为自定义类重载逻辑 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 =&gt; 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); 

结果为@​​987654329@。

是我做错了什么,还是无法重载标准 or,and,xor 运算符?

【问题讨论】:

    标签: operator-overloading raku


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      相关资源
      最近更新 更多