我目前正在进入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)
现在我不明白为什么使用对象表示法禁用右关联功能。有人可以解释这个或链接到这个问题的文档吗?
答案 0 :(得分:5)
来自the spec,“中缀操作”:
操作员的关联性由操作员的最后一个字符决定。以冒号“:”结尾的运算符是右关联的。所有其他运算符都是左关联的。
方法+:
在List上定义,这就是(List(1,2)).+:(3)
有效的原因。它的实现是这样的,元素放在前面,所以相当于3 :: List(1, 2)
,但这与此无关。
使用中缀表示法List(1,2) +: 3
将不起作用,因为(如规范中所述)所有以冒号结尾的中缀运算符都是右关联的,这意味着“右手” “正在使用带有”左侧“的操作符作为参数,而不是反之亦然。
基本上,
1 +: 2 +: 3 +: List(4, 5)
和
List(4, 5).+:(3).+:(2).+:(1)
具有相同的效果(我知道你的问题已经非常明显了,但我只是强调正确的关联性)。
所以,用一个简单的句子来回答你的问题:对象表示法中的右侧关联性不是删除,而是在中缀表示法中添加了 ,但仅适用于以冒号结尾的方法。