为什么Scala中的对象表示法显然消除了以':'结尾的方法的右侧关联性?

J.O*_*ber 3 scala object-notation scala-collections

我目前正在进入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)
Run Code Online (Sandbox Code Playgroud)

现在我不明白为什么通过使用对象表示法来禁用右关联性功能.有人可以解释这个或链接到这个问题的文档?

slo*_*ouc 5

根据规范,"中缀运营":

操作员的关联性由操作员的最后一个字符决定.以冒号":"结尾的运算符是右关联的.所有其他运算符都是左关联的.

方法+:在List上定义,这就是为什么(List(1,2)).+:(3)有效.它的实现使得元素放在前面,所以相当于3 :: List(1, 2),但这在这里是无关紧要的.

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

基本上,

1 +: 2 +: 3 +: List(4, 5) 
Run Code Online (Sandbox Code Playgroud)

List(4, 5).+:(3).+:(2).+:(1)
Run Code Online (Sandbox Code Playgroud)

具有相同的效果(我知道在你的问题中已经非常明显,但我只是强调正确的关联性).

所以,用一个简单的句子来回答你的问题:不是右侧关联性在对象表示法中被删除,更多的是它被添加到中缀符号中,但仅用于以冒号结尾的方法.