scala中列表(8,9)。:: :(列表(1,2))和列表(1,2):::列表(8,9)之间有什么区别?

时间:2016-04-25 12:23:53

标签: scala

为什么我们在使用点运算符时应用圆括号以及为什么输出

List(8,9).:::(List(1,2))

List(1,2):::List(8,9)相同

2 个答案:

答案 0 :(得分:3)

问题有点不清楚,但我猜测你的实际问题是:

  

怎么回事:

     

List(1, 2) ::: List(3, 4) == List(3, 4).:::(List(1, 2)) == List(1, 2, 3, 4)

换句话说,如何省略点和括号反转参数的顺序?

答案是Scala针对中缀运算符的特殊关联性规则,来自Scala Reference,第6.12.3章:

  

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

这意味着当使用中缀表示法时(即没有点和parens),此运算符(:::)以冒号结尾,使用左侧值作为方法参数和右手方法作为调用方法:::的对象。当作为常规方法调用(即使用点和parens)调用时,该方法是左关联的,因为所有方法都是(“左”对象是调用它的对象,右边是参数)。

答案 1 :(得分:2)

调用方法的“普通”Java风格方式是a.b(c)。 Scala为具有单个参数的方法提供了另外的等效表示法:您可以省略点和parens来编写a b c

对于名称以:结尾的方法,还有一个附加规则:在右操作数而不是左操作数上调用该方法。因此a b: c去了c.b:(a)而不是a.b:(c)