如何创建一个右结合的中缀运算符?

38

我有一个关联操作>>。问题是它的成本与其左操作数的大小成线性关系。因此,由n>>应用程序序列形成的表达式如下:

a >> a >> a >> a >> a >> ... >> a

这个表达式的二次成本与 n 相关,因为默认情况下中缀运算符是 左结合 的。如何使其成为右结合,以便保持这种表达式的成本在 n 方面保持线性?

1个回答

64
我找到了一个解决方案。Scala的参考文献第6.12.3节中写道:

运算符的结合性由运算符的最后一个字符确定。以冒号“:”结尾的运算符是右结合的。所有其他运算符都是左结合的。

因此,将>>重命名为>>:就足够了。

我花了一些时间才意识到,虽然a >> b被展开为a.>>(b),但a >>: b被展开为b.>>:(a)。所以我必须定义>>:如下:

def >>:(x: T): T = x >> this

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接