不能重载 Raku 中的 >> 运算符

Posted

技术标签:

【中文标题】不能重载 Raku 中的 >> 运算符【英文标题】:Can't overload the >> operator in Raku 【发布时间】:2020-12-07 04:09:57 【问题描述】:

我正在尝试像这样重载 >> 运算符:

class A 

multi sub infix:«>>»(A:D $a, Str() $b) is assoc<non>  dd $a; dd $b 
my $x = A.new;
$x >> 'output.txt';

但我在第 5 行收到一个编译错误:

Unsupported use of >> to do right shift.  In Raku please use: +> or ~>.

我错过了什么?

【问题讨论】:

【参考方案1】:

这是 Rakudo 的编译器(有点)过于聪明的一个例子。因为 Raku 中有不同类型的移位操作,并且都没有使用双箭头,所以 Rakudo 使用的语法设置了 &gt;&gt; 以触发习惯于其他语言的人的警报。我想当时没有人想到有人会创建一个&gt;&gt; 运算符,这是有道理的,因为&gt;&gt; 或多或少意味着可能存在一个&lt;&lt;,考虑到它被用作引号,这可能会造成各种破坏和一个元运算符。

您可以在此处查看语法代码: https://github.com/rakudo/rakudo/blob/9d6d8dd7a72aed698e30b6fe4b8eea62642c62c6/src/Perl6/Grammar.nqp#L4104

【讨论】:

重载&gt;&gt; 可能是个坏主意还有另一个原因:即使没有重载&lt;&lt;,在某些情况下它也可能与超级运算符冲突。例如,以下是有效的 Raku:(&lt;a b&gt;, &lt;c d&gt;)&gt;&gt;[1] # OUTPUT: (b d)。这将与您提出的定义相冲突。 (这并不是说 Rakudo 阻止你这样做是对的,但似乎值得注意) codesection:对,这正是我在提到元运算符时所想的。我可能应该在答案中将这一点分开一点,以使其更清楚。谢天谢地,&gt;&gt;&gt; 工作没有问题,所以如果你只是想要视觉外观并且不介意额外的字符,这是一个选项 嗯,我明白了,听起来它并不意味着超载。即使 sub 的签名将左操作数“固定”到仅 A 类的实例,它仍然会导致其他类型的操作数出现问题吗? cowbaymoo:一般不会。如果您查看 Grammar.nqp,问题在于它有 &lt;.sorryobs(…)&gt; (其他标记没有它)。一旦达到该令牌,它将在编译时退出,甚至在它有机会解决是否调用运算符之前。这可以通过首先添加检查以查看是否有人定义了自定义中缀等来解决,但由于&gt;&gt; 的多义性,即使它被修复为可能,我也会避免它。这就像试图让) 成为一个中缀......你可以但是...... 我同意@user0721090601 在各种语法插槽中&gt;&gt; 的各种现有含义,强烈反对它是可覆盖的。也许它属于%categorically-won't-work

以上是关于不能重载 Raku 中的 >> 运算符的主要内容,如果未能解决你的问题,请参考以下文章

运算符重载

重载运算符中的分段错误>>

运算符重载

C#中的运算符重载

c ++模板类中的运算符重载

c++4.1小测