3

我目前正在进入 Scala 并且想知道在调用以“:”结尾的方法时使用对象表示法的区别。由于以 ':' 结尾的方法名称通常会产生右侧关联性,因此在使用对象表示法调用此类方法时,这似乎会发生变化。

例子:

scala> 3 +: List(1,2) 
res1: List[Int] = List(3, 1, 2) 

scala> List(1,2) +: 3 // does not compile due to right side associativity

scala> (List(1,2)).+:(3) 
res2: List[Int] = List( 3, 1, 2)

现在我不明白为什么使用对象表示法会禁用右关联功能。有人可以对此进行解释或链接到有关此问题的文档吗?

4

1 回答 1

5

规范中,“中缀操作”:

运算符的关联性由运算符的最后一个字符决定。以冒号 `:' 结尾的运算符是右结合的。所有其他运算符都是左结合的。

方法+:是在列表上定义的,这就是(List(1,2)).+:(3)有效的原因。它的实现是将元素放在前面,因此等同于3 :: List(1, 2),但这在这里无关紧要。

使用中表示法List(1,2) +: 3不起作用,因为(如规范中所述)所有以冒号结尾的中缀运算符都是右结合的,这意味着“右手边”使用带有“左手边”作为参数的运算符, 而不是反之亦然。

基本上,

1 +: 2 +: 3 +: List(4, 5) 

List(4, 5).+:(3).+:(2).+:(1)

具有相同的效果(我知道这在您的问题中已经非常明显了,但我只是在强调右关联性)。

因此,用一个简单的句子回答您的问题:并不是在对象表示法中删除了右侧关联性,而是在中缀表示法中添加了它,但仅适用于以冒号结尾的方法。

于 2018-03-29T11:15:11.500 回答